直接插入排序
基本思想
在要排序的一组数中,假设前面 n-1(n>=2)个数已经是排好序的,现在要把第 n 个数插入到前面的有序数中,使得这 n 个数也是排好序的。如此反复循环,直到全部排好顺序。
复杂度
- 最优情况:O(n),当输入数组就是排好序的时候
- 最差情况:O(n^2),当输入数组为倒序时
适用情况
比较适合用于少量元素的数组
快速排序
基本思想
选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序序列分成两部分,一部分比基准元素小、一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分
复杂度
- 最优情况:O(n)
- 最差情况:O(n^2),当输入数组已排序时
- 随机化后的情况:期望为O(n)
总结
| 方法 | 平均时间复杂度 | 最好情况时间复杂度 | 最坏情况时间复杂度 | 空间复杂度(辅助存储) | 稳定性 |
|---|---|---|---|---|---|
| 直接插入 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
| 快速排序 | O(n) | O(n) | O(n^2) | O(n) | 不稳定 |
| 基数排序 | 稳定 |
选择策略:
-
若n较小(如n<=50),可采用直接插入或简单选择排序。当记录规模较小时,直接插入排序较好;否则因为简单选择移动的记录数少于直接插入,应选简单选择排序为宜。
-
若文件初始状态为基本正有序,则应选用直接插入、冒泡或随机的快速排序为宜。
-
若n较大,则应采用时间复杂度为O(n)的排序方法:快速排序、堆排序或归并排序。
快速排序在目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。
堆排序所需的空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。但是,上述这两种排序都是不稳定的。
若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。