内排序方法的比较





内 部 排 序 { 插 入 排 序 { 直 接 插 入 排 序 折 半 插 入 排 序 希 尔 排 序 交 换 排 序 { 冒 泡 排 序 快 速 排 序 选 择 排 序 { 简 单 选 择 排 序 堆 排 序 归 并 排 序 基 数 排 序 内部排序 \begin{cases} 插入排序 \begin{cases} 直接插入排序\\ 折半插入排序\\ 希尔排序\\ \end{cases}\\ \\ 交换排序 \begin{cases} 冒泡排序\\ 快速排序\\ \end{cases}\\ \\ 选择排序 \begin{cases} 简单选择排序\\ 堆排序\\ \end{cases}\\ \\ 归并排序\\ \\ 基数排序\\ \end{cases} { {



各种内部排序算法的比较:

算法种类 时间复杂度 空间复杂度 是否稳定
最好情况 最坏情况 平均情况
直接插入排序 O(n) O(n2) O(n2) O(1)
冒泡排序 O(n) O(n2) O(n2) O(1)
简单选择排序 O(n2) O(n2) O(n2) O(1)
折半插入排序 O(n) O(n2) O(nlog2n) O(1)
堆排序 O(nlog2n) O(nlog2n) O(nlog2n) O(1)
快速排序 O(nlog2n) O(n2) O(nlog2n) O(log2n)
归并排序 O(nlog2n) O(nlog2n) O(nlog2n) O(n)
希尔排序 O(1)
基数排序 O(d(n+r)) O(d(n+r)) O(d(n+r)) O(r)


关于时间复杂度

平均情况而言:

  • 直接插入排序、简单选择排序、冒泡排序: O ( n 2 ) O(n^2) O(n2)
  • 折半插入排序、堆排序、快速排序、归并排序: O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
  • 希尔排序介于前两者之间

若从最好情况考虑:

  • 直接插入排序、折半插入排序、冒泡排序最低: O ( n ) O(n) O(n)
  • 其他算法的最好情况与平均情况相同

若从最坏情况考虑:

  • 快速排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

故最好情况下,直接插入排序、冒泡排序最快;
在平均情况下,快速排序最快;
在最坏情况下:堆排序、归并排序最快。


关于空间复杂度

  • O ( n ) O(n) O(n):归并排序
  • O ( l o g 2 n ) O(log_2n) O(log2n) ~ O ( n ) O(n) O(n):快速排序
  • O ( 1 ) O(1) O(1):剩余的其他排序


关于适用问题的规模

设待排序元素序列的元素个数(问题规模)为 n n n,则 n n n越小,采用简单排序方法越合适, n n n越大,采用改进后的排序方法越合适。

  • 适合 n n n较小的排序算法:包括所有的简单排序算法,如直接插入排序、冒泡排序、简单选择排序,以及部分改进排序算法,如折半插入排序等。
  • 适合 n n n较大的排序算法:希尔排序、堆排序、快速排序、归并排序和基数排序等。


综合来看

  • n n n较大,排序码分配较随机,且对稳定性不做要求时:快速排序
  • n n n较大,内存空间允许,且要求排序稳定时:归并排序或基数排序
  • n n n较大,排序码分布可能会出现正序或逆序的情况,且对稳定性不做要求时:堆排序
  • n n n较小,初始序列基本有序或分布较随机,且要求稳定时:直接插入排序
  • n n n较小,且对稳定性不做要求:简单选择排序
  • 如果初始序列已经按关键字基本有序:直接插入排序、冒泡排序

你可能感兴趣的:(数据结构——排序算法,数据结构,算法,排序算法)