一、内部排序算法的比较
从时间复杂度来看:
- 简单选择排序、直接插入排序和冒泡排序平均情况下都为O(n²),且实现过程也比较简单,插入排序和冒泡排序最好情况下可以达到O(n),而简单选择排序与序列的初始状态无关
- 希尔排序作为插入排序的拓展,对较大规模的排序都可以达到很高的效率,但目前未得出精确的渐进时间。
- 堆排序利用了一种称为堆的数据结构,可在线性时间内完成建堆,且在O(nlog₂n)内完成排序过程。
- 快速排序基于分治的思想,虽然最坏情况下快速排序会达到O(n²),但是快速排序的平均性能可以达到O(nlog₂n)。
- 归并排序同样基于分治的思想,但由于其分治的思想,但由于其分隔子序列与初始序列的排列无关,因此它的最好、最坏和平均时间复杂度均为O(nlog₂n)
从空间复杂度来看:
- 简单选择排序、插入排序、冒泡排序、希尔排序和堆排序仅需要借助常数个辅助空间。
- 快速排序在空间上只使用一个小的辅助栈,用于是实现递归,平均情况下大小为O(log₂n),最坏情况下可能达到O(n)。
- 2路归并排序在合并操作中需要借助较多的辅助空间用于元素复制,大小为O(n)。
算法种类 |
时间复杂度 |
空间复杂度 |
是否稳定 |
||
最好情况 |
平均情况 |
最坏情况 |
|||
直接插入排序 |
O(n) |
O(n²) |
O(n²) |
O(1) |
是 |
冒泡排序 |
O(n) |
O(n²) |
O(n²) |
O(1) |
是 |
简单选择排序 |
O(n²) |
O(n²) |
O(n²) |
O(1) |
否 |
希尔排序 |
|
|
|
O(1) |
否 |
快速排序 |
O(nlog₂n) |
O(nlog₂n) |
O(n²) |
O(log₂n) |
否 |
堆排序 |
O(nlog₂n) |
O(nlog₂n) |
O(nlog₂n) |
O(1) |
否 |
2路归并排序 |
O(nlog₂n) |
O(nlog₂n) |
O(nlog₂n) |
O(n) |
是 |
基数排序 |
O(d(n+r)) |
O(d(n+r)) |
O(d(n+r)) |
O(r) |
是 |
二、内部排序算法的应用
-
选取排序方法需要考虑的因素
- 待排序的元素数目
- 元素本身信息量的大小
- 关键字的结构及其分布情况
- 稳定性的要求
- 语言工具的条件,存储结构及辅助空间的大小等
-
排序算法小结
- 若待排序的元素个数较小(小于50),可以直接插入排序或者简单选择排序.
- 若文件的初始状态已按关键基本有序,则选用直接插入或冒泡排序
- 若排序元素较大,应该采用时间复杂度为O(nlog₂n)的排序:快速排序、堆排序、归并。其中快速平均时间最短,堆辅助空间小于快速排序,不会出现快速排序的最坏情况,但是二者都不稳定。若是要求排序稳定,选择归并排序。
- 任何借助比较的排序算法至少需要O(nlog₂n)的时间
- 若n很大,记录的关键字位数又比较小且可以分解,采用基数排序较好。
- 当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。