当前位置: 首页 > news >正文

C++数据结构X篇_21_插入排序(稳定的排序)

文章目录

  • 1. 插入排序原理
  • 2. 算法图解
  • 3. 核心代码:
  • 4. 插入排序整体代码实现

1. 插入排序原理

插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入

  1. 原理是将无序序列插入到有序序列中
  2. 直接插入排序的两种性质:
  • 当待排序的原序列中大多数元素都已有序的情况下,此时进行的元素比较和移动的次数较少;

  • 当原序列的长度很小时,即便它的所有元素都是无序的,此时进行的元素比较和移动的次数还是很少。

后篇介绍的希尔排序就是基于上面2个性质的改进

2. 算法图解

将待排序的集合看做两部分,已排序的区间(0…i) ; 待排序的区间[i…n);每次选择无序区间的第一个元素插入到有序区间的合适位置,直到整个数组有序。

因为不知道数组中得前几个元素是已经有序的,所以直接从第二个元素开始执行插入排序,将每个元素都进行一次插入排序。

算法图解如下:
在这里插入图片描述

3. 核心代码:

void insert_sort(int arr[], int length)  //升序
{int j;//第一个元素当做有序的,第二个看做无序,从第二个插入第一个元素并进行比较for (int i = 1; i < length; i++){if (arr[i] < arr[i - 1])  //比升序序列最大值要小,进入插入排序{int temp = arr[i];//从右向左for (j = i - 1; j >= 0; j--){if (temp < arr[j]) //升序序列中元素大于arr[i]{arr[j + 1] = arr[j]; //向前移动一位}else{break;}}arr[j + 1] = temp;}}
}

4. 插入排序整体代码实现

#include <iostream>
using namespace std;void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}//打印数组
void printArr(int arr[])
{for (int i = 0; i < 10; i++){cout << arr[i] << endl;}
}//插入排序
void insert_sort(int arr[], int length)  //升序
{int j;for (int i = 1; i < length; i++){if (arr[i] < arr[i - 1])  //比升序序列最大值要小{int temp = arr[i];for (j = i - 1; j >= 0; j--){if (temp < arr[j]) //升序序列中元素大于arr[i]{arr[j + 1] = arr[j]; //向前移动一位}else{break;}}arr[j + 1] = temp;}}printArr(arr);
}int main()
{int arr[] = { 8,2,3,9,6,4,7,1,5,10 };insert_sort(arr, 10);system("pause");return 0;
}

运行结果:
在这里插入图片描述

  1. 插入排序,插入排序代码实现,插入排序代码思路梳理
  2. 优秀博文:十大经典排序算法-插入排序算法详解,常见的几种排序(C++)

相关文章:

  • WordPress(7)配置邮箱发送功能
  • C/S架构学习之使用epoll实现TCP特大型并发服务器
  • 【Java系列】LinkedList
  • requirements.txt用法你真的清楚吗
  • 1819_ChibiOS的互斥信号与条件变量
  • Idea Debug断点太多 启动太慢
  • 【易售小程序项目】后端部署、Uniapp项目Web部署
  • electron27+react18集成搭建跨平台应用|electron窗口多开
  • 皮卡丘RCE靶场通关攻略
  • Linux——文件权限属性和权限管理
  • 简述JVM
  • EVE111
  • 讲述为什么要学习Adobe XD以及 Adobe XD下载安装
  • Centos安装RabbitMQ,JavaSpring发送RabbitMQ延迟延时消息,JavaSpring消费RabbitMQ消息
  • Java中作为数据库某个表的实体类为什么一定要实现Serializable接口
  • .pyc 想到的一些问题
  • 【RocksDB】TransactionDB源码分析
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【面试系列】之二:关于js原型
  • 【刷算法】从上往下打印二叉树
  • 2017 年终总结 —— 在路上
  • ComponentOne 2017 V2版本正式发布
  • java中的hashCode
  • ng6--错误信息小结(持续更新)
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue.js框架原理浅析
  • 对JS继承的一点思考
  • 好的网址,关于.net 4.0 ,vs 2010
  • 记一次用 NodeJs 实现模拟登录的思路
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 数组大概知多少
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 湖北分布式智能数据采集方法有哪些?
  • (14)Hive调优——合并小文件
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (生成器)yield与(迭代器)generator
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)memcache、redis缓存
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 表达式计算:Expression Evaluator
  • .net对接阿里云CSB服务
  • .NET多线程执行函数
  • .net反编译的九款神器
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • @RunWith注解作用
  • [2016.7 test.5] T1
  • [2016.7.Test1] T1 三进制异或
  • [BT]BUUCTF刷题第8天(3.26)
  • [C# 开发技巧]实现属于自己的截图工具