内排序方法的比较
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较小,且对稳定性不做要求:简单选择排序
- 如果初始序列已经按关键字基本有序:直接插入排序、冒泡排序
以上是关于内排序方法的比较的主要内容,如果未能解决你的问题,请参考以下文章