Skip to content

十大经典排序算法对比 ​


1. 为什么需要一页“横向比较” ​

前面的排序主章和图解页更强调“把单个算法讲透”。但真正到做题、面试、工程选型时,难点往往不是“某个算法会不会写”,而是:

  1. 为什么这里该选归并,不该选快排。
  2. 为什么这里宁可用计数排序,也不做比较排序。
  3. 为什么数据近乎有序时,插入排序反而不差。
  4. 为什么系统库里经常混合使用多种排序策略。

所以这一页专门解决“横向比较”的问题。

2. 十大经典排序算法总表 ​

算法平均复杂度最坏复杂度空间复杂度稳定性原地核心思想
冒泡排序O(n^2)O(n^2)O(1)稳定是相邻交换,大数后沉
选择排序O(n^2)O(n^2)O(1)不稳定是每轮选最小值
插入排序O(n^2)O(n^2)O(1)稳定是把当前元素插入已排序区
希尔排序视步长而定O(n^2)O(1)不稳定是分组插入,逐步缩小间隔
归并排序O(n log n)O(n log n)O(n)稳定否分治拆分,有序合并
快速排序O(n log n)O(n^2)递归栈不稳定近似原地基准划分
堆排序O(n log n)O(n log n)O(1)不稳定是维护堆顶最值
计数排序O(n+k)O(n+k)O(k)稳定否统计频次直接定位
桶排序平均 O(n+k)取决于桶内排序取决于桶数视实现而定否按范围分桶
基数排序O(d(n+r))O(d(n+r))O(n+r)稳定否按位分配,多轮稳定排序

说明:

  1. k 常表示值域大小或桶数。
  2. d 表示位数。
  3. r 表示基数,如十进制排序时的 10。

3. 三类最基础的 O(n^2) 算法 ​

3.1 冒泡排序 ​

3.2 选择排序 ​

3.3 插入排序 ​

4. 希尔排序:为什么它常被叫作“改良版插入排序” ​

5. 三类最核心的 O(n log n) 比较排序 ​

5.1 归并排序 ​

5.2 快速排序 ​

5.3 堆排序 ​

6. 非比较排序:什么时候可以快过 O(n log n) ​

6.1 计数排序 ​

6.2 桶排序 ​

6.3 基数排序 ​

7. 做题和工程里的选型建议 ​

7.1 如果题目说“数组基本有序” ​

7.2 如果题目强调“稳定排序” ​

7.3 如果题目强调“值域很小” ​

7.4 如果题目强调“最坏也不能太慢” ​

7.5 如果题目强调“内存很紧” ​

8. 工业实现为什么常用混合排序 ​

9. 最常见的误区 ​

10. 一张“怎么选”的速查表 ​

11. 学完这一页后应达到的标准 ​