8.6.各种内部排序算法的比较和应用

1. 比较排序算法

简单排序算法

排序算法 最好时间复杂度 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性 原地排序
冒泡排序 \(O(n)\) \(O(n^{2})\) \(O(n^{2})\) \(O(1)\) 稳定
选择排序 \(O(n^{2})\) \(O(n^{2})\) \(O(n^{2})\) \(O(1)\) 不稳定
插入排序 \(O(n)\) \(O(n^{2})\) \(O(n^{2})\) \(O(1)\) 稳定

高效比较排序算法

排序算法 最好时间复杂度 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性 原地排序
希尔排序 \(O(nlog_{2}n)\) \(O(n^{1.3})\) \(O(n^{2})\) \(O(1)\) 不稳定
快速排序 \(O(nlog_{2}n)\) \(O(nlog_{2}n)\) \(O(n^{2})\) \(O(log_{2}n)\) 不稳定
归并排序 \(O(nlog_{2}n)\) \(O(nlog_{2}n)\) \(O(nlog_{2}n)\) \(O(n)\) 稳定
堆排序 \(O(nlog_{2}n)\) \(O(nlog_{2}n)\) \(O(nlog_{2}n)\) \(O(1)\) 稳定



2. 非比较排序算法

排序算法 最好时间复杂度 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性 原地排序
计数排序 \(O(n + k)\) \(O(n + k)\) \(O(n + k)\) \(O(k)\) 稳定
桶排序 \(O(n + k)\) \(O(n + k)\) \(O(n^{2})\) \(O(n + k)\) 稳定
基数排序 \(O(n * d)\) \(O(n * d)\) \(O(n * d)\) \(O(n + k)\) 稳定

符号说明

  • n:数据规模

  • k:数据范围(计数排序)或桶的数量(桶排序)

  • d:数据的位数(基数排序)




拓展

  1. 为什么快速排序比归并排序更常用。

    1. 快速排序的常数因子更小,且是原地排序,而归并排序需要\(O(n)\)的额外空间。

    2. 缓存友好,快速排序访问数据,缓存命中率高。

  2. 堆排序为什么不如快速排序快。

    1. 缓存不友好,堆的父子节点跳跃访问(非连续内存),导致缓存命中率低。

    2. 非自适应(不考虑已经排好序的元素的算法),无论数据是否有序,固定需要\(O(nlog_{n})\)的时间。

    3. 实现复杂,建堆和调整堆的算法比快排更难实现,


posted @ 2025-03-25 13:40  薛定谔的AC  阅读(101)  评论(0)    收藏  举报