排序方法 | 平均时间 | 最坏情况 | 辅助存储 | 稳定性 | 备注 |
冒泡排序 | O(n^2) | O(n^2) | O(1) | 稳定 | |
插入排序 | O(n^2) | O(n^2) | O(1) | 稳定 | |
选择排序 | O(n^2) | O(n^2) | O(1) | 不稳定 | |
快速排序 | O(n*logn) | O(n^2) | O(logn) ~ O(n) | 不稳定 | 快速排序的空间占用源于需要栈空间来实现递归 |
堆排序 | O(n*logn) | O(n*logn) | O(1) | 不稳定 | |
归并排序 | O(n*logn) | O(n*logn) | O(n) | 稳定 | |
桶排序 | O(n) | O(n) | O(m) | 稳定 | m表示序列元素的值的上界 |
基数排序 | O(p*n) | O(p*n) | O(r*n) | 稳定 | p是序列元素以r为基数时的最大位数 |
Shell排序 | - | O(n^2) | O(1) | 不稳定 | Shell排序的性能取决于增量序列的选取,很难给出平均时间 |
选择合适的排序方法时,通常要考虑以下因素:
- 待排序记录的规模n
- 时间和空间复杂度的要求
- 稳定性要求
- 记录的初始状态(是否部分有序)
- 关键字的结构(是否为多关键字)
我们的结论是:
1.若n较大,应选择平均时间复杂度为O(n*logn)的排序方法如快速排序、堆排序以及归并排序
2.在上面提到的时间复杂度为O(n*logn)的三种排序方法中:
- 快速排序的平均性能是最好的,但最坏情况下(初始状态记录已基本有序)快速排序会蜕化为冒泡排序,时间复杂度为O(n^2)(虽然出现最坏情况的概率很低)
- 堆排序相较于快速排序的优势在于,需要的辅助空间更少,并且堆排序最坏情况的时间复杂度仍为O(n*logn)
- 归并排序的优势在于,它既能保持O(n*logn)的时间复杂度,还是一种稳定排序,这是快速排序和堆排序均不具备的;另外,可将堆排序与插入排序结合使用(子序列较短时使用直接插入排序,较长时使用归并)
3.n较小时(n<=50),可采用插入排序或选择排序
???4.若初始状态记录基本有序,应选择插入排序、冒泡排序或随机的快速排序