插入排序(Insertion Sort)与逆序对(Inversion)速记
一、核心知识点
思想:像整理扑克牌,每次将当前元素插入前面已排序序列,始终保持前缀有序。
过程特点:第 i 趟结束后,前 i+1 个元素一定有序。
复杂度:最好 O(N)(原序列已有序),平均 O(N²),最坏 O(N²)(完全逆序)。
空间复杂度 :O(1)。稳定性:稳定排序。
二、逆序对(考试重点)
逆序对定义:若 i<j 且 Ai>Aj,则(Ai,Aj)构成一个逆序对。插入排序每移动一次元素,恰好消除一个逆序对,因此实际时间复杂度可写成 O(N+I) (I为逆序对数)。若数组几乎有序,则 I 很小,插入排序接近 O(N)。随机排列平均逆序对数为 N(N−1)/4 ,因此所有只能交换相邻元素的排序算法平均时间复杂度下界都是 Ω(N²)。
三、常考结论
① 插入排序效率高度依赖初始序列;
② 逆序对越少,插入排序越快;
③ 插入排序适合小规模、近乎有序的数据;
④ Shell排序之所以比Insertion快,是因为一次交换可以消除多个逆序对;
⑤ 插入排序稳定,而快速排序、堆排序一般不稳定。
四、例题解析
1.【2024-2025 R1-7】
题目: During the insertion sort process, the order of magnitude of the number of comparisons is independent of the initial state of the sequence.
答案:False。 插入排序比较次数与初始序列密切相关,最好情况 O(N),最坏情况 O(N²),因此不是 independent。
2.【2024-2025 R2-18】
题目: 哪个序列采用插入排序比较次数最少?
答案:B。 插入排序比较次数≈逆序对数量,因此只需找最接近有序的序列即可。B 只有少数元素位置错误,逆序对最少,所以比较次数最少。
3.【2020-2021 R2-4】
题目: 根据前两趟排序结果判断第三趟。
分析: 第一趟后 88 到最后,第二趟后 16 到倒数第二,说明每一趟都是把当前最大元素放到最终位置,因此这是 Bubble Sort,不是 Insertion、Selection 或 Shell。第三趟继续进行一次冒泡即可,考试按照冒泡过程模拟即可。
4.【2017-2018 R1-5】
题目: 若数组逆序对少于20个,则 Insertion Sort 一定优于 Quick Sort、Heap Sort。
答案:True。 因为插入排序复杂度为 O(N+I),I<20 时几乎就是 O(N),实际运行通常快于 Quick 和 Heap。
5.【2017-2018 R1-6】
题目: Bubble Sort 第一趟后可能没有任何元素到达最终位置。
答案:False。 第一趟冒泡结束后,最大元素一定已经到达最终位置,因此至少有一个元素归位。
6.【2015-2016 2-12】
题目: 根据前两趟排序结果判断排序算法。
分析: 第一趟 88 到最后,第二趟 34 到倒数第二,每趟固定一个最大元素,这是 Bubble Sort 的典型特征。
答案:Bubble Sort。
7.【2015-2016 2-19】
题目: 第一趟结果为 {19,21,7,14,5,27,1,10},判断排序算法。
分析: Selection 第一趟应把最小元素放最前;Merge 第一趟应形成多个长度为2的有序段;Quick 第一趟应确定 Pivot;Heap Sort 第一趟会把最大元素交换到最后。根据第一趟结果判断,应为 Heap Sort 。
答案:Heap Sort。
五、考试重点总结(★★★★★)
必须掌握:① 插入排序每趟使前缀有序;② 时间复杂度最好 O(N)、平均/最坏 O(N²);
③ 稳定、原地排序;④ 时间复杂度 O(N+I);⑤ 逆序对定义与平均数量 N(N−1)/4;
⑥ 能根据每趟排序结果区分 Insertion、Bubble、Selection、Heap、Merge、Quick。
希尔排序(Shell Sort)速记版
一、核心思想
希尔排序="分组插入排序",用增量 h:把数组按 h 分成若干子序列,对每个子序列做插入排序;然后逐步减小 h,直到 h=1(最后一次普通插入排序)。
二、本质理解(非常重要)
Shell sort本质是:多轮"间隔插入排序" → 逐步让序列更接近有序 → 最后h=1完成全局有序 ;关键性质:h-排序后仍保持h-有序。
三、增量序列(考试重点)
1. Shell原始:
h=N/2, N/4, ...,1 → 最坏O(N²)
2. Hibbard:
h=2^k−1 → 更优,约O(N^(3/2))
3. Sedgewick:
约O(N^(4/3))(更优但不常考复杂推导)
四、核心性质(必考)
✔ 不稳定排序(重点)
✔ 原地排序 O(1)空间
✔ 增量决定复杂度
✔ 本质=多次插入排序(但"跨步插入")
五、为什么Shell比Insertion快?
Insertion:一次只能消除1个逆序对
Shell:一次h-排序可以消除"远距离逆序对"→ 一次操作消除多个逆序对
六、稳定性结论
❌ Shell sort不稳定(必考) 原因:跨间隔交换可能改变相等元素相对顺序。
七、复杂度总结
Shell原始:Θ(N²)
Hibbard:≈O(N^(3/2))
Sedgewick:≈O(N^(4/3))
八、真题讲解
1.【2023-2024 R1-1】
判断两趟Hibbard shell排序结果是否正确
核心方法:
h=2^k−1序列 → 每一趟是"h-间隔插入排序"
✔ 判断原则:
-
第1趟:大间隔 → 粗排序
-
第2趟:更小间隔 → 更有序
-
不需要逐元素精算,只需检查"h有序性"
结论:该题给出的两趟结果符合Hibbard逐步收敛规律 → ✔ True
2.【2017-2018 2-4】
已知两趟结果,求增量
第一趟结果:(4, 2, 1, 8, 3, 5, 10, 6, 9, 11, 7)
第二趟结果:(1,2,3,5,4,6,7,8,9,11,10)
解题思路(核心技巧):
Shell每一趟都是 hk-排序,所以:
✔ 第2趟结果必须是"更小h的插入排序结果"
观察:
-
第二趟出现明显"局部有序"
-
说明 h=1(最后一趟插入排序)
→ 第二趟 increment=1
再看第一趟:
-
分成若干子序列进行"跨步整理"
-
结构较粗 → 对应较大h
尝试分组发现:
h=5时结构最吻合
最终答案:
👉 第一趟 h=5,第二趟 h=1
九、考试最重要总结(必须背)
⭐ Shell核心一句话
Shell sort = 多轮"间隔插入排序",逐步缩小h直到1
⭐ 三个必考点
✔ 不稳定 ✔ 原地排序 ✔ 复杂度依赖增量序列
⭐ 最重要区别
| 排序 | 特点 |
|---|---|
| Insertion | 相邻交换 |
| Shell | 间隔交换 |
| Bubble | 冒泡最大值 |
| Selection | 选最小/最大 |
⭐ 高频陷阱
❌ Shell稳定
❌ Shell复杂度固定O(N²)
❌ Shell每次只是普通插入排序
⭐ 一句话总结
Shell sort = "带间隔的插入排序 + 逐步缩小间隔 + 用空间换时间的优化版插入排序"
堆排序 & 归并排序 速记模板
三、堆排序(Heapsort)
堆排序="先建堆,再不断删除最大值/最小值放到末尾",每次调整堆。
两步流程
① BuildHeap(O(N))
② N−1次 DeleteMax + PercDown(每次O(logN))
复杂度
时间:O(N log N)(稳定上界)
空间:O(1)(原地排序)
性质
❌ 不稳定 ✔ 原地排序 ✔ 适合大数据但常数大
堆排序"理论平均最优"但实际可能慢于Shell/Quick(缓存不友好+常数大)
四、归并排序(Mergesort)
核心思想
分治:左半排序 + 右半排序 + Merge合并两个有序序列
递推关系
T(N)=2T(N/2)+O(N)
复杂度
时间:O(N log N)
空间:O(N)(必须额外数组)
性质
✔ 稳定排序
❌ 非原地(需要Tmp数组)
易错点
必须全局只开一个Tmp数组,否则空间会变成O(N log N)
三、核心对比(必背)
| 项目 | 堆排序 | 归并排序 |
|---|---|---|
| 时间 | O(N log N) | O(N log N) |
| 空间 | O(1) | O(N) |
| 稳定性 | ❌ 不稳定 | ✔ 稳定 |
| 方法 | 堆结构 | 分治 |
| 实际性能 | 常数大 | 稳定但耗空间 |
四、Run(趟)概念(归并排序必考)
迭代归并:
-
第1趟:单个元素合并成2个有序段
-
第2趟:2→4
-
第3趟:4→8
结论:run次数 = logN
五、真题解析
1.【2023-2024 1-2-2】
判断迭代归并前两趟结果
关键:
归并排序特点:
-
第1趟:长度1→2
-
第2趟:长度2→4
只要检查:✔ 是否满足"局部2有序→4有序结构"
结论:
题目给的结构不满足标准merge run规律 → ❌ False
2.【2020-2021 R1-1】
第二趟归并结果判断核心:归并第二趟必须是:
每4个元素有序
给的结果没有形成正确4-merge结构 → ❌ False
4.【2016-2017 2-1】
迭代归并 run 数 答案:✔ ⌈log₂N⌉
5.【2015-2016 1-5】
"merge runs = O(N log N)"? 错误!
原因:每一趟只做 O(N) 共 logN 趟
所以:总时间 = O(N log N)
但"run次数"不是NlogN → ❌ False
6.【2016-2017 1-2】
Heapsort extra space?
结论:✔ O(1)
原因:原地堆 + swap → ❌ False(题目说O(N))
六、⭐ 考试核心总结(必须背)
✔ stability(归并稳定,堆不稳定)
✔ space(堆O(1),归并O(N))
✔ run(logN)
⭐ 一句话总结
Heap = 用堆不断删最大值(原地不稳定)
Merge = 分治合并有序段(稳定但要额外空间)