感谢原文作者:http://knowmore.blogbus.com/logs/11803419.html
一、排序的分类
1. 根据排序的稳定性,排序可以分为稳定排序和非稳定排序。
稳定排序:冒泡排序、直接插入排序
不稳定排序:选择排序、希尔排序、快速排序
2. 根据数据在排序过程中所在的位置可以分为:内部排序和外部排序
内部排序 : 冒泡排序,直接插入排序,简单选择排序,快速排序,堆排序
外部排序 : 多路平衡归并、置换 - 选择排序、最佳归并树
3. 按策略划分内部排序方法,可分为 : 插入排序、选择排序、交换排序、归并排序和分配排序。
二、内部排序常用算法比较
排序方法 | 平均时间 | 最坏情况 | 辅助存储 |
简单排序 | O(n 2 ) | O(n 2 ) | O(1) |
快速排序 | O(nlogn) | O(n 2 ) | O(logn) |
堆排序 | O(nlogn) | O(nlogn) | O(1) |
归并排序 | O(nlogn) | O(nlogn) | O(n) |
基数排序 | O(d(n+rd)) | O(d(n+rd)) | O(rd) |
希尔排序 | O(n 3/2 ) | O(n 2 ) | O(1) |
从表中可以得出以下几个结论:
(1) 从平均时间性能而言,快速排序最佳,其所需时间最省。但快速排序在最坏情况下的时间性能不如堆排序和归并排序。而后者相比较的结果是:在 n 较大时,归并排序所需的时间要比堆排序少,但它所需的辅助存储量最多。
(2) 上表的“简单排序”是指除了希尔排序以外的所有插入排序、起泡排序和简单选择排序,其中以直接插入排序最为简单,当序列中的记录“基本有序 ” 或 n 值较小时,它是最佳的排序方法。因此,常将它和其它的排序方法,诸如快速排序、归并排序等结合在一起用。
(3) 基数排序的时间复杂度也可以写成 O(d · n) 。因此,它最适用于 n 值很大,而关键字较小的序列。若关键字也很大,而序列在的“最高位关键字”均不同,则亦可先按“最高位关键字”不同分成若干“小”的子序列,然后进行直接插入排列。
(4) 从方法的稳定性比较,基数排序是稳定的内排方法,所有时间复杂度是 O(n 2 ) 的简单排序都是稳定的 ( 除选择排序 ) , 而快速排序、堆排序和希尔排序等时间性能较好的排序方法都是不稳定的。一般来说,排序过程中的“比较”是在“相邻的两个记示关键字”间进行的排序方法是稳 定的。值得注意的是:稳定性是由方法本身决定的。对不稳定的排序方法,不管其描述形式如何,总能举出一个说明其不稳定性的实例来。反之,对稳定的排序方 法,总能找到一种引起稳定的描述形式。由于大多数情况下排序是按记录的主关键字进行的,则所用的排序方法是否稳定无关要紧。若排序是按次关键字进行的,则 应根据问题所需,慎重选择排序方法及其描述算法。
综上所述: 没有哪一种排序方法是最优的。有的适用于 n 较大的情况,有的适用于 n 较小的情况……在实际应用中应根据不同情况适当选用,甚至可以将多种方法结合使用。