数据结构基础——第七板块:Sorting(插入排序、希尔排序、堆排序、归并排序)

插入排序(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 = 分治合并有序段(稳定但要额外空间)