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. 学完这一页后应达到的标准