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

一、基本思想

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

第 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 )

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

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


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

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

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

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

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

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

相关推荐
u01110267511 分钟前
工具页案例图如何编写 alt让图片说明与处理场景对应
java·前端·javascript·图像处理·人工智能·算法·ai作画
阿狗童鞋16 分钟前
数据结构与算法实战指南
数据结构·算法
Navigator_Z38 分钟前
LeetCode //C - 1275. Find Winner on a Tic Tac Toe Game
c语言·算法·leetcode
未来之窗软件服务41 分钟前
递归时间复杂度演算T (n)=aT (n/b)+f (n)-东方仙盟
算法·仙盟创梦ide·东方仙盟
垆边人似月.1 小时前
华为机考题:明明的随机数
数据结构·算法·华为
Doubbbbbbble云2 小时前
多维空间索引结构R树与KD树性能对比研究4
算法
海上小飞龙2 小时前
【KMP算法-中篇】next 数组的递推:往前填一位,靠的是往回退几步
算法
lusklusklusk2 小时前
Python 四大数据结构详解:元组、列表、集合、字典的特点与增删改查
数据结构·windows·python
keyipatience2 小时前
B树详解:从零构建平衡多路搜索树
数据结构·b树·算法·图搜索
FluxArt2 小时前
GPT Image 2.5 多图参考怎么用:Flux Art 生成与编辑教程
数据结构·gpt·算法