排序算法涉及了广泛的算法分析技术,对排序问题的研究也促进了文件处理技术的发展,这里由于有些外排序问题在执行时必须不断地从外存读取信息(这部分信息由于太大而无法在内存中直接存放)。内排序(Internal Sort),则是指在内存中完成排序。
以“存储在数组中的一组记录”为数据类型,数组中的每一个记录内部都有一个域成为排序关键码(Sort Key)。排序就是重排一组记录,使其关键码域的值具有规定的顺序。排序问题中的记录可有相同的关键码Key,涉及到排序算法是否稳定,稳定的意思是算法不改变具有相同关键码记录的原始输入顺序。
分析排序算法时,传统方法是衡量关键码之间进行比较的次数,有时用统计算法中的交换次数。这种方法与算法消耗的时间有关,而与机器和数据类型无关。排序算法的时间复杂度:O(n*n) -----> O(nlog2n) -----> O(n)。
人们之所以热衷于研究多种排序方法,是因为排序在计算机中所处的地位;另一方面,由于这些方法各有优缺点,难以得出哪个最好和哪个最坏的结论。因此,排序方法的选用视具体场合而定。一般情况下考虑的原则有,(1)待排序的记录个数;(2)记录本身的大小;(3)关键字的分布情况;(4)对排序稳定性的要求。
下面就从这几个方面对下面所讨论的各种排序方法做综合比较。
简单排序(选择、冒泡和插入排序)(Selection Sort、Bubble Sort、Insert Sort)
快速排序(Quick Sort)
归并排序(Merge Sort)
希尔排序(Shell Sort)
堆排序(Heap Sort)
基数排序(Radix Sort)
- 时间性能
(1)按平均的时间性能来分,有三类排序方法。时间复杂度为O(nlog2n)的方法有快速排序、堆排序、归并排序。其中快速排序目前被认为是最快的一种排序方法,后两者的比较,在n值较大的情况下,归并排序比堆排序更快。时间复杂度为O(n*n)的方法有插入排序、冒泡排序、选择排序。其中插入排序最为常用,特别是对于已按关键字基本有序排列的序列尤为如此,选择排序中记录移动次数最少。时间复杂度为O(n)的排序方法只有基数排序一种。
(2)当待排序记录序列按关键字顺序有序时,插入排序和冒泡排序能达到O(n)的时间复杂度;而对于快速排序,这是最不好的情况,此时的时间性能退化为O(n*n),因此应尽量避免。
(3)希尔排序、堆排序和归并排序的时间性能不随着记录序列中关键字的分布而改变。在大多数情况下,人们应事先对要排序的记录关键字的分布情况有所了解,才可对症下药,选择有针对性的排序方法。
(4)以上对排序的时间复杂度的讨论主要考虑排序过程中所需要进行的关键字间的比较次数,当待排序记录中其他各数据项比关键字占有更大的数据量时,还应考虑到排序过程中移动记录的操作时间,有时这种操作的时间在整个排序过程中占的比例更大,从这个观点考虑,简单排序的三种排序方法中冒泡排序效率最低。
- 空间性能
空间性能是指排序过程中所需的辅助空间大小。
(1)所有的简单排序方法(IS、BS、SS)和堆排序的空间复杂度均为O(1);
(2)快速排序的为O(log2n),为递归程序执行过程中枢轴所需的辅助空间;
(3)归并排序和基尔排序所需的辅助空间最多,空间复杂度为O(n)。
- 排序方法的稳定性能
(1)稳定的排序方法是指对于两个关键字相等的记录在经过排序后,不改变它们在排序之前在序列中的相对位置;
(2)除快速排序、堆排序是不稳定的排序方法外,前面的其他排序方法都是稳定的。Eg.对关键字序列(8_1,5,8_2,3)进行快速排序,其结果为(3,5,8_2,8_1);
(3)“稳定性”是由方法本身决定的。一般来说,排序过程中所进行的比较操作和交换数据仅发生在相邻的数据之间,没有大步距的数据调整时,排序方法是稳定的。如果选择排序没有满足稳定的要求是因为每趟在右部无序区找到最小记录后,常要跳过很多记录进行交换调整,显然若把“交换调整”的方式改一改就能写出稳定的选择排序算法,而对不稳定的排序方法,不论其算法的描述形式如何,总能举出一个说明它不稳定的实例。
在使用排序方法时,有下列几种选择:
(1)若待排序的记录个数n值较小(例如n<30),则可以选用插入排序,但记录所含数据项较多时,所占存储量大时,应选择SSA。反之,如果待排序的记录个数n值较大,应选用快排。但如果待排序记录关键字有“有序”倾向时,要慎用快排,而宁可选择归并或堆排序。
(2)快速排序和归并排序在n值较小时的性能不及插入排序,因此实际应用中,可将它们和插入排序混合使用。如在快排划分子区间的长度小于某值时,转而调用插入排序;或对待排序记录序列先逐段进行插入排序,然后再利用归并操作进行两两归并直至整个序列有序为止。
(3)基数排序的时间复杂度为O(d*n),因此特别适合于待排序记录数n很大,而关键字“位数d”较小的情况,并且还可以调整“基数”(如将基数定为100或1000等)以减少基数排序的趟数d的值。
(4)一般情况下,进行排序的记录的关键字各不相同,则排序时所用的排序方法是否稳定无关紧要,但在有些情况下,排序必须用稳定的排序方法。Eg.一组学生记录已按学号的顺序有序,由于某种需要,希望根据学生的身高进行一次排序,并且排序结果应保证相同身高的同学之间的学号有序。显然,对身高排序时必须使用稳定的排序方法。
上面对排序方法的讨论是比较单纯的数据模型,而实际问题往往比这更复杂,需要综合运用多种排序方法。
Eg.有些场合,关键字的组成结构不一定是整数型,每个分关键字有不同的属性值。
汽车牌照皖AH3784、皖AH6612是字母、数字的混合结构。这是一种多关键字的排序应用,需要把关键字拆成汉字、字母、数字3个分关键字,进行3次排序。而第2/3次的排序又必须是稳定的排序方法。
算法的时间复杂度是指算法执行过程中所需要的基本运算次数。
算法的空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的量度。
排序——快速排序(快慢指针实现)_满守园的博客-CSDN博客_快慢指针排序
大顶堆、小顶堆及其建堆过程、堆排序_满守园的博客-CSDN博客
Have Fun