主题
常见排序算法图解
1. 为什么要单独做一页图解
很多人学排序时的问题,不是代码不会写,而是“过程感”太弱。知道时间复杂度是一回事,真正看懂元素在每一轮比较、交换、划分、合并里怎样变化,是另一回事。
这一页专门解决这个问题。写法上不再强调“全量定义”,而是强调:
- 这个算法每一轮到底在做什么。
- 元素移动的方向和原因是什么。
- 为什么它最后一定会有序。
- 复杂度和稳定性是如何从过程里长出来的。
2. 先建立一张总表
| 算法 | 核心思想 | 平均复杂度 | 稳定性 | 原地 |
|---|---|---|---|---|
| 冒泡排序 | 相邻比较,大数后沉 | O(n^2) | 稳定 | 是 |
| 选择排序 | 每轮选最小值放前面 | O(n^2) | 不稳定 | 是 |
| 插入排序 | 把当前元素插入已排序区 | O(n^2) | 稳定 | 是 |
| 归并排序 | 分治拆分,再有序合并 | O(n log n) | 稳定 | 否 |
| 快速排序 | 选基准做划分 | O(n log n) | 不稳定 | 近似原地 |
| 堆排序 | 维护堆顶最值 | O(n log n) | 不稳定 | 是 |
下面的图解会分成两组:
- 比较排序:重点看元素之间怎样比较、交换、划分、合并。
- 非比较排序与改良排序:重点看怎样利用值域、位数、分桶或分组结构跳出纯比较模型。
