上面讨论的排序算法均是比较常用的,而且都属于内部排序,总结如下:
排序法 | 平均时间 | 最差情形 | 稳定度 | 额外空间 | 备注 |
冒泡 | O(n2) | O(n2) | 稳定 | O(1) | n小时较好 |
直接插入 | O(n2) | O(n2) | 稳定 | O(1) | 大部分已排序时较好 |
希尔 | O(nlogn) | O(ns) 1<s<2 | 不稳定 | O(1) | s是所选分组 |
快速 | O(nlogn) | O(n2) | 不稳定 | O(logn) | n大时较好 |
归并 | O(nlogn) | O(nlogn) | 稳定 | O(n) | n大时较好 |
折半插入 | O(n2) | O(n2) | 稳定 | O(1) | 仅比插入排序减少了比较次数 |
简单选择 | O(n2) | O(n2) | 稳定 | O(1) | n小时较好 |
堆 | O(nlogn) | O(nlogn) | 不稳定 | O(1) | n大时较好 |
基数 | O(d(n+rd)) | O(d(n+rd)) | 稳定 | O(rd) | 多关键字排序 |
(1 )从平均时间性能而言,快速排序最佳,所需时间最省,但快速排序在最坏情况下的时间性能不如堆排序和归并排序。而后两者相比较的结果是,在n很大时,归并排序所需时间较堆排序省,但它所需辅助存储量最多。
(2 ) 上表中的冒泡排序,简单选择排序, 直接插入排序,折半插入排序,其中以直接插入排序为最简单,当序列中的记录“基本有序”或n值较小时,它是最佳的排序方法,因此常将它和其他方法,诸如快速排序,归并排序等结合在一起使用。
(3 )基数排序的时间复杂度也可以写成O(d*n)。因此,它最适用于n值很大而关键字较小的序列。若关键字也很大,而序列中大多数记录的“最高位关键字”均不同,则亦可先按“最高位关键字”不同将序列分成若干“小”的子序列,而后进行直接插入排序。
(4 )从方法的稳定性来比较,基数排序是稳定的内部排序方法,所有时间复杂度为O(n2)的简单排序法(包括除希尔排序外的所有插入排序,冒泡排序和简单选择排序)也是稳定的,然而,快速排序,堆排序和希尔排序 等时间性能较好的排序算法都是不稳定的。
综上所述,没有哪一种排序算法是绝对最优的,有的适用于n较大的情况,有的适用于n较小的情况,有的适用于多关键字的排序,有的.......,因此,在实际应用中需要根据不同情况适当选择相应的算法,甚至可将多种方法结合起来使用。