排序方法 | 空间复杂度 | 时间复杂度 | 稳定 | 适用范围 |
---|---|---|---|---|
直接插入排序 | O(1) | O(nlogn) – O(n2) – O(n2) | 稳定 | 基本有序+小数组 |
折半插入排序 | O(1) | 平均–O(n2) | 稳定 | 相比直接插入,比较次数变少,但是插入次数不变 |
希尔(增量)排序 | O(1) | 根据增量变化O(n1.25)~O(1.6Xn1.25) | 不稳定 | 大数组,n越大优势越大 |
冒泡排序 | O(1) | O(n2) | 稳定 | 小数组 |
快速排序(对冒泡的改进) | O(1) | O(nlogn) – O(nlogn) – O(n2) | 不稳定(出于性能上的考虑,牺牲了算法的稳定性) | 在序列有序或者逆序的情况下最不利于发挥其长处 |
选择排序 | O(1) | O(n2) | 不稳定 | 性能差,稳定差,数组小 |
堆排序 | O(1) | O(nlogn) | 不稳定 | 求最大(小)的m个 |
基数排序 | 最坏O(kn) | O(n+B),其中n为待排序元素个数,而B是桶数 | 稳定 | 桶数少的情况 |
归并排序 | O(n) | O(nlogn) | 稳定 | 快速+稳定,牺牲空间换时间 |
总结:
1.空间复杂度:除了基数排序(桶)和归并排序,其他的都是O(1)。归并很容易是O(n),牺牲空间换时间。基数排序最坏则是O(kn)。
2.时间复杂度(性能):最好的则是堆排序和归并排序,最好最坏都是线性对数阶O(nlogn)。最差的是冒泡排序和选择排序,最好最坏都是平方阶O(n2)。希尔排序性能取决于数组的大小和增量选择,数组越大性价比越高(突然想到小米)。直接插入排序和折半插入排序则取决于小数组是否有序,有序性价比高。快速排序恰恰相反,有序或者逆序的情况下性价比低。(插入和快排妥妥的死对头)。
3.稳定性:基于选择(找出最大最小)的排序方法,比如简单选择排序,堆排序都是不稳定的。希尔排序和快排也是不稳定的。剩下的都稳定。(不稳定的4个)
4.适用范围:
小数组:选择冒泡、插入、选择等简单排序方法;
大数组:希尔排序等;
有序:直接插入和折半插入;
无序:快排;
性能好:归并和堆排序;
只求最大(小)几个:堆排序。