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

一、基本思想

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

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

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

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


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

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

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

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

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

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

相关推荐
BK贝壳2 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
企业数字化笔记4 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!5 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小郎君6587 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧7 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
Shimeri8 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J8 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang8 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
爱读书的小胖9 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy9 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化