07 排序算法-下:O(n log n) 三剑客(⚠️ 人工关注)
李永乐式比喻:
- 归并排序 = 拆试卷。老师把 100 份试卷分成两组(各 50 份),每组再分,一直分到 1 份。然后按分数高低合并两个有序堆。分而治之。
- 快速排序 = 选班长。从班里选一个人当"基准",比基准高的站右边,低的站左边。两边再各选一个基准……
- 堆排序 = 淘汰赛。建一个锦标赛淘汰树,冠军就是最大元素。
三剑客对比
性能对比(100 万条数据)
| 算法 | 比较次数 | 额外内存 | 实际耗时 | 谁在用? |
|---|---|---|---|---|
| 归并排序 | ~2000 万次 | O(n) ~8MB | ~0.3s | sorted() 用了 |
| 快速排序 | ~2000 万次 | O(log n) 微量 | ~0.2s 最快 | list.sort() 用了 |
| 堆排序 | ~3000 万次 | O(1) = 0 | ~0.5s | Top K 场景 |
归并排序的分治流程
企业场景
| 场景 | 用的算法 | 为什么 |
|---|---|---|
Python sorted() / list.sort() | TimSort(归并+插入混合) | 稳定 + 利用局部有序性 |
Java Arrays.sort() 对象数组 | TimSort | 同上 |
Java Arrays.sort() 基本类型 | 双轴快排 | 不需要稳定性 |
| 数据库外部排序(数据 > 内存) | 归并排序 | 只要内存能装 2 页就能无限归并 |
| 实时 Top K 排行榜 | 堆排序 | 只维护 K 个元素 O(n log K) |
AI 协作
AI 生成:
- 归并/快排/堆排的 Python 实现 -- 各 15~30 行
- 可视化三种排序的耗时对比(数据量 1000 -> 100 万)
- LeetCode 215 第 K 大元素、148 排序链表
人类决策:
- 数据量 < 1000 -> 插入排序就够了
- 数据在内存中 -> 语言内置排序已最优化,直接用
- 数据在磁盘上 -> 归并排序
- 需要 Top K -> 堆排序