数据结构----插入排序

一、基本思想

插入排序的核心思想:把数组分为「有序区」和「无序区」。初始状态:

第 1 个元素天然为有序区;

后面所有元素为无序区。

每一趟排序:从无序区取出第一个元素,向前扫描有序区,按照大小顺序,插入到有序区的合适位置;重复操作,直到整个数组全部转为有序区。特点:逐个插入、逐步有序,稳定排序、就地排序。


二、直接插入排序

  1. 算法原理

数组下标从 i = 1 开始(默认 a [0] 有序);

暂存当前待插入元素 temp = a[i];

从有序区末尾 j = i-1 向前遍历;

若 a[j] > temp,向后移位腾出空位;

直到找到比 temp 小的位置,将 temp 插入;

i++,进入下一趟。

  1. 完整代码
复制代码
  1. void InsertSort(int a[], int n)

  2. {

  3. int i, j, temp;

  4. for(i = 1; i < n; i++)

  5. {

  6. temp = a[i]; // 待插入元素

  7. // 向前移位

  8. for(j = i - 1; j >= 0 && a[j] > temp; j--)

  9. {

  10. a[j + 1] = a[j];

  11. }

  12. a[j + 1] = temp; // 插入正确位置

  13. }

  14. }

  15. 性能分析

最好情况(数组已有序):O(n)

最坏 / 平均情况:O(n 2 )

空间复杂度:O(1) 原地排序

稳定性:稳定(相等元素不交换相对位置)


三、折半插入排序(二分插入排序)

  1. 改进思路

直接插入排序中,向前查找插入位置是顺序查找效率低;利用有序区已有序,改用折半查找快速定位插入点,减少比较次数。 仅减少比较次数,元素移动次数不变。

  1. 核心流程

折半查找,快速确定待插入位置 low;

将插入位置后所有元素统一后移;

放入待插入元素。

  1. 性能

比较次数:O(nlog 2 n)

移动次数:仍为 O(n 2 )

整体时间复杂度:O(n 2)稳定、原地排序


四、希尔排序(缩小增量插入排序)

  1. 改进思想

直接插入在数据逆序、乱序时效率极差;希尔排序:分组 + 远距离插入先取较大增量,将数组分组,组内直接插入排序;逐步缩小增量,直至增量为 1,退化为普通插入排序。

  1. 原理

设定增量 d,按下标间隔 d 分组;每组内部做直接插入排序;不断缩小 d,重复分组排序;d=1 整体有序。

  1. 关键性质

时间复杂度:约 O(n 1.3 )

稳定性:不稳定(远距离交换会打乱相等元素顺序)

属于插入类排序,是直接插入的优化版本


五、插入排序共同特点总结

算法逻辑简单,易于理解、代码短;

适合数据量小、基本接近有序的序列;

直接插入、折半插入:稳定;希尔排序:不稳定;

都是就地排序,额外空间仅常数级;

数据越有序,插入排序越快。

相关推荐
吃好睡好便好7 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅7 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue9 小时前
三角形数
笔记·算法·数论·组合数学
Mr. zhihao10 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
念何架构之路10 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星10 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑10 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光11 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩11 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_6294947312 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表