一、内部排序算法的比较
从时间复杂度来看:
- 简单选择排序、直接插入排序和冒泡排序平均情况下都为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很大,记录的关键字位数又比较小且可以分解,采用基数排序较好。
- 当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。