摘自《数据结构教程》(第三版)李春葆等编著 清华大学出版社 P296
排序方法 | 平均情况 | 最坏情况 | 最好情况 | 空间复杂度 | 稳定性 | 复杂性 |
直接插入排序 | O(n2) | O(n2) | O(n) | O(1) | 稳定 | 简单 |
希尔排序 | O(n1.3) | O(1) | 不稳定 | 较复杂 | ||
冒泡排序 | O(n2) | O(n2) | O(n) | O(1) | 稳定 | 简单 |
快速排序 | O(nlog2n) | O(n2) | O(nlog2n) | O(log2n) | 不稳定 | 较复杂 |
直接选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 | 简单 |
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 不稳定 | 较复杂 |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | 稳定 | 较复杂 |
基数排序 | O(d(n+r)) | O(d(n+r)) | O(d(n+r)) | O(r) | 稳定 | 较复杂 |
因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法应综合考虑下列因素:
(1)待排序的记录数目n(问题规模);
(2)记录的大小(每个记录的规模);
(3)关键字的结构及初始状态;
(4)对稳定性的要求;
(5)语言工具的条件;
(6)存储结构;
(7)时间和辅助空间复杂度等。
没有哪一种排序方法是绝对好的。每一种排序方法都有其优点,适合于不同的环境。因此,在实际应用中,应根据具体情况做选择。
首先考虑排序对稳定性的要求,若要求稳定,则只能在稳定方法中选取,否则可以在所有方法中选取;
其次要考虑待排序结点数n的大小,若n较大,则可在改进方法中选取,否则在简单方法中选取;
然后再考虑其他因素。