内部排序算法的比较及应用. - Touale Cula's Blog

前言

算法对比

时空复杂度、算法的稳定性、算法的过程特征


时间复杂度

简单选择排序、直接插入排序和冒泡排序平均情况是 O(n^2^)

直接插入排序和冒泡排序最好情况是 O(n)

简单选择排序与初始状态无关(需要遍历求出最小或者最大的数字)

希尔排序对大规模的的排序可以达到很高的效率

堆排序可以在线性时间内完成建堆

快速排序基于分治思想,平均性能可以达到 O(nlog2n),在实际应用中常常由于其他算法

归并排序也基于分治思想,最好最坏平均时间复杂度都是O(nlog2n)


空间复杂度

简单选择排序、插入排序、冒泡排序、希尔排序和堆排序仅需要常数个辅助空间

快速排序需要使用一个小的辅助栈完成递规,平均大小 O(log2n),最坏情况是 O(n)

2路归并排序在合并操作中需要借助较多的辅助空间完成复制,大小 O(n)


稳定性

插入排序、冒泡排序、归并排序、基数排序是稳定的排序方法

简单选择排序、快速排序、希尔排序、堆排序是不稳定


过程特征

快速排序在一趟处理后就能确定一个元素的最终位置

冒泡和堆排序每趟处理都能产生当前的最大值或最小值


总结

算法|时间最好|时间平均|时间最坏|空间|稳定|
-|-|-|-|-|-|-|-
直接插入排序|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(1)|否
快速排序|O(nlog2n)|O(nlog2n)|O(n2)|O(log2n)|否
堆排序|O(nlog2n)|O(nlog2n)|O(nlog2n)|O(1)|否
2路归并排序|O(nlog2n)|O(nlog2n)|O(nlog2n)|O(n)|是
基数排序|O(d(n + r))|O(d(n + r))|O(d(n + r))|O(r)|是