目录
一、基本概念
1. 排序的分类
1.1 内排序和外排序
内排序:整个表都放在内存中处理,排序时不涉及数据的内外存交换。
外排序: 在许多实际应用中,经常需要对大文件进行排序,因为文件中的记录很多,信息量庞大,无法将整个文件拷贝进内存进行排序。因此,需要将带排序的记录存储在外存上,排序时再把数据一部分一部分的调入内存进行排序,在排序中需要多次进行内外存的交互,对外存文件中的记录进行排序后的结果仍然被放到原有文件中。这种排序方法就称外部排序。
(简而言之,排序时不断进行数据的内外存交换,叫外排序)
1.2 内排序的分类
- 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
- 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。
-
-
1.3 外排序的分类
-
1.4 排序算法的性能
1.5 正序和反序
正序:待排序元素的关键字顺序正好和要排序的顺序相同。
反序:待排序元素的关键字顺序正好和要排序的顺序相反。
1.6 内排算法的稳定性
- 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
- 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
1.7 排序方法的时空复杂度及稳定性
二、算法的选择
2.1 选择排序算法的依据
影响排序的因素有很多,平均时间复杂度低的算法并不一定就是最优的。相反,有时平均时间复杂度高的算法可能更适合某些特殊情况。同时,选择算法时还得考虑它的可读性,以利于软件的维护。
2.2 排序算法选择的建议
1、若n较小(n<=50),则可以采用直接插入排序或者简单选择排序。由于直接插入排序所需的记录移动操作较简单选择排序多,因而当记录本身信息量较大时,用简单选择排序较好。
2、若文件的初始状态已按关键字基本有序,则选择直接插入或者冒泡排序为宜。
3、若n较大,则应采用时间复杂度为O(nlogn)的排序方法:快速排序、堆排序或归并排序。快排被认为目前基于比较的内部排序法中最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。
堆排序所需的辅助空间少于快排,并且不会出现快排可能出现的最坏情况,这两种排序都是不稳定的。若要求排序稳定且时间复杂度为O(nlogn),则可以选择归排序。
4、若n很大,记录的关键字位数较少且可以分解时,采用基数排序较好。
5、当记录本身信息量较大时,为避免耗费大量的时间移动记录。可用链表作为存储结构。
1) 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:
快速排序、堆排序或归并排序序。
快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
堆排序 : 如果内存空间允许且要求稳定性的,
归并排序:它有一定数量的数据移动,所以我们可能过与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。
2)当n较大,内存空间允许,且要求稳定性:归并排序
3)当n较小,可采用直接插入或直接选择排序。
直接插入排序:当元素分布有序,直接插入排序将大大减少比较次数和移动记录的次数。
直接选择排序 :元素分布有序,如果不要求稳定性,选择直接选择排序
4)一般不使用或不直接使用传统的冒泡排序。
5)基数排序
它是一种稳定的排序算法,但有一定的局限性:
1、关键字可分解。
2、记录的关键字位数较少,如果密集更好
3、如果是数字时,最好是无符号的,否则将增加相应的映射复杂度,可先将其正负分开排序。