插入排序
插入排序的核心思路是逐步构建有序序列。我们将数组分为'已排序'和'未排序'两部分,初始时已排序部分只包含第一个元素。每次从未排序部分取出一个元素,向前插入到已排序序列的正确位置,保持整体有序。
这个过程很像整理扑克牌:每摸到新的一张牌,就把它插到手牌中合适的位置。随着卡片一张张加入,整副牌最终变得有序。

代码实现
// 插入排序(此处为降序,升序将 a[end] < tmp 改为 a[end] > tmp)
void InsertSort(int* a, int n) {
// 遍历未排序元素(从第 2 个元素开始)
for (int i = 1; i < n; i++) {
int end = i - 1; // 已排序部分末尾下标
int tmp = a[i]; // 保存当前待插入元素
// 向前查找合适位置,大于 tmp(降序)则后移
while (end >= 0) {
if (a[end] < tmp) {
a[end + 1] = a[end]; // 元素后移腾位置
end--;
} else {
break; // 找到位置,退出循环
}
}
a[end + 1] = tmp; // 插入到正确位置
}
}
性能分析
- 时间复杂度:最坏情况下,插入第 k 个元素需比较 k 次,总次数为等差数列求和,即 O(N^2);若数组已有序,每个元素仅需比较 1 次,可优化至 O(N)。
- 空间复杂度:仅使用常数级辅助变量,为 O(1)。
- 稳定性:稳定。相等元素的相对位置在插入过程中不会改变。
希尔排序
希尔排序是插入排序的改进版,核心思想是分组插入,逐步缩小增量。先将数组按某个步长(gap)分割成若干子序列进行插入排序,让数组整体变得'基本有序'。随后逐步缩小 gap,重复上述过程,直到 gap 为 1 时完成最后一次插入排序。




