编辑
2025-03-29
编程学习
00

目录

参考材料

排序算法经常在笔试和面试中考到,大部分会问平均时间复杂度、空间复杂度、稳定性和是否原地排序的性质,还有少部分会问到最优、最差时间复杂度,神烦无比。而网上的总结又五花八门、莫衷一是,因而自己也收集材料整理一番,虽然无法做到特别全面,但也希望能覆盖大部分的情况。

排序算法平时时间复杂度最好时间复杂度最坏时间复杂度空间复杂度1原地排序稳定性
选择排序2O(n2)\Omicron(n^2)O(n2)\Omicron(n^2)O(n2)\Omicron(n^2)O(1)\Omicron(1)原地不稳定
冒泡排序O(n2)\Omicron(n^2)O(n)\Omicron(n)O(n2)\Omicron(n^2)O(1)\Omicron(1)原地稳定
插入排序O(n2)\Omicron(n^2)O(n)\Omicron(n)O(n2)\Omicron(n^2)O(1)\Omicron(1)原地稳定
希尔排序3---O(1)\Omicron(1)原地不稳定
快速排序O(nlog(n))\Omicron(n\log(n))O(nlog(n))\Omicron(n\log(n))O(n2)\Omicron(n^2)O(1)\Omicron(1)原地不稳定
归并排序4O(nlog(n))\Omicron(n\log(n))O(nlog(n))\Omicron(n\log(n))O(nlog(n))\Omicron(n\log(n))O(n)\Omicron(n)非原地稳定
堆排序5O(nlog(n))\Omicron(n\log(n))O(nlog(n))\Omicron(n\log(n))O(nlog(n))\Omicron(n\log(n))O(1)\Omicron(1)原地不稳定
计数排序6O(n+k)\Omicron(n+k)O(n+k)\Omicron(n+k)O(n+k)\Omicron(n+k)O(n+k)\Omicron(n+k)非原地稳定
桶排序7O(n+k)\Omicron(n+k)O(n+k)\Omicron(n+k)O(n2)\Omicron(n^2)O(n+k)\Omicron(n+k)非原地稳定
基数排序8O(mn)\Omicron(mn)O(mn)\Omicron(mn)O(mn)\Omicron(mn)O(n)\Omicron(n)非原地稳定

注释:

  1. 这里的空间复杂度并没有讨论递归的栈空间,否则快速排序的空间复杂度为 O(log(n))\Omicron(\log(n))
  2. 选择排序由于需要交换数组元素导致不稳定,若是链表排序,则不存在交换问题,因此会是稳定的
  3. 希尔排序的复杂度与间距序列的选取有关,由于各处的说法并不统一,因此未列出
  4. 归并排序可以用于链表的排序,同时可以递归的排序,也可以从下往上排序。对链表来说,自下而上排序不需要额外的栈空间和辅助空间。表中列出的是最常见的对数组的递归排序O(n)\Omicron(n) 的空间复杂度是由于引入了辅助数组
  5. 堆排序使用数组表达
  6. 计数排序中,nn 为元素数量,kk 为数据范围(或者说是映射后的数据范围),引入了前缀和计数数组辅助数组(非原地排序),因此的空间复杂度 O(n+k)\Omicron(n+k)
  7. 桶排序的时间复杂度为 O(n+n2/k+k)\Omicron(n + n^2/k + k),当 knk \approx n 时有 O(n+k)\Omicron(n + k),当 k1k \approx 1 时有 O(n2)\Omicron(n^2)
  8. 基数排序,mm 为数字的位数(关键字数量),kk为不同数字的个数(关键字值域)。表中数据是 LSD + 计数排序对数字排序的场景,则空间复杂度由 O(n+k)\Omicron(n+k) 简化到 O(n)\Omicron(n)

参考材料

本文作者:Zerol Acqua

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!