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

一、基本思想

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

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

后面所有元素为无序区。

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


二、直接插入排序

  1. 算法原理

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

暂存当前待插入元素 temp = ai

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

若 aj > 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 )

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

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


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

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

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

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

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

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

相关推荐
GreenTea1 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
fqq32 小时前
力扣刷题前置Java语法
算法·leetcode·职场和发展
2501_906565124 小时前
数学之美探究
算法
oier_Asad.Chen5 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
leisoo80976 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
luj_17688 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
wuyk5559 小时前
3.链表:用指针串联的动态数据结构
c语言·开发语言·数据结构·链表
郝学胜-神的一滴9 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆9 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
Water_Sunzhipeng9 小时前
2024牛客暑期多校训练营1
算法