以下是 **十大经典排序算法** 的时间复杂度、空间复杂度及稳定性总结,适用于面试快速回顾:
排序算法对比表
排序算法 | 最佳时间复杂度 | 平均时间复杂度 | 最差时间复杂度 | 空间复杂度 | 稳定性 | 核心思想 |
---|---|---|---|---|---|---|
冒泡排序 | O(n) | O(n²) | O(n²) | O(1) | 稳定 | 相邻元素交换,大数沉底。 |
选择排序 | O(n²) | O(n²) | O(n²) | O(1) | 不稳定 | 每次选最小元素放到已排序末尾。 |
插入排序 | O(n) | O(n²) | O(n²) | O(1) | 稳定 | 将未排序元素插入已排序序列。 |
希尔排序 | O(n log n) | O(n log² n) | O(n log² n) | O(1) | 不稳定 | 分组(增量)插入排序,逐步缩小间隔。 |
归并排序 | O(n log n) | O(n log n) | O(n log n) | O(n) | 稳定 | 分治法,合并有序子序列。 |
快速排序 | O(n log n) | O(n log n) | O(n²) | O(log n) | 不稳定 | 分治法,基准值分区递归排序。 |
堆排序 | O(n log n) | O(n log n) | O(n log n) | O(1) | 不稳定 | 构建堆结构,交换堆顶与末尾。 |
计数排序 | O(n + k) | O(n + k) | O(n + k) | O(n + k) | 稳定 | 统计元素出现次数,累加输出。 |
桶排序 | O(n + k) | O(n + k) | O(n²) | O(n + k) | 稳定 | 分桶后对每个桶单独排序。 |
基数排序 | O(nk) | O(nk) | O(nk) | O(n + k) | 稳定 | 按位分配收集,从低位到高位。 |
关键说明
-
稳定性:稳定排序算法保证相等元素的相对顺序不变(如
归并排序
),不稳定算法可能改变(如快速排序
)。 -
适用场景:
- 小规模数据:冒泡、插入、选择排序(简单但效率低)。
- 大规模数据:快速、归并、堆排序(O(n log n) 复杂度)。
- 特定数据分布:
- 整数且范围小:计数排序。
- 均匀分布数据:桶排序。
- 多关键字排序:基数排序。
-
空间复杂度:
- 原地排序:冒泡、插入、选择、希尔、堆排序(O(1) 空间)。
- 非原地排序:归并、计数、桶、基数排序(需额外空间)。
-
快速排序优化:
- 三数取中法:避免最坏情况 O(n²)。
- 小数组切换插入排序:递归到小数组时用插入排序提升效率。
面试常见问题
-
为什么快速排序在实际应用中比归并排序更常用?
- 快速排序是原地排序,缓存友好;归并排序需要 O(n) 额外空间。
-
堆排序为什么不如快速排序快?
- 堆排序数据访问方式跳跃(非局部性原理),缓存命中率低。
-
如何选择排序算法?
- 数据规模、内存限制、稳定性需求、数据分布特征。