内排序方法的比较

Posted 薛定谔的猫ovo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内排序方法的比较相关的知识,希望对你有一定的参考价值。





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



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

算法种类时间复杂度空间复杂度是否稳定
最好情况最坏情况平均情况
直接插入排序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较小,且对稳定性不做要求:简单选择排序
  • 如果初始序列已经按关键字基本有序:直接插入排序、冒泡排序

以上是关于内排序方法的比较的主要内容,如果未能解决你的问题,请参考以下文章

集合Collections 常用的排序方法

排序算法-1

在 nlog(n) 时间内对整数数组进行排序而不使用比较运算符

Mysql 分组并排序

mySQL分组排序

基数排序和各种排序方法的比较