排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(-或记录)的任意序列,重新排列成一个按关键字有序的序列。
为了查找方便,通常希望计算机中的表是按关键字有序的。因为有序的顺序表可以采用查找效率较高的折半查找法,其平均查找长度为log:(n+1)一1,而无序的顺序表只能进行顺序查找,其平均查找长度为(n十1)/2。又如建造树表(无论是二叉排序树或B-树)的过程本身就是一个排序的过程。
为了便于讨论,再次首先要对排序下一个确切的定义:
上述排序定义中的关键字K可以是记录R,(i=1,2,…,n)的主关键字,也可以是记录R;的次关键字,甚至是若干数据项的组合。若K是主关键字,则任何一个记录的无序序列经排序后得到的结果是惟一的;若K。是次关键字,则排序的结果不惟一,因为待排序的记录序列中可能存在两个或两个以上关键字相等的记录。假设K;=K,;(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中R;领先于R,(即 i≤j)。若在排序后的序列中R,仍领先于R,,则称所用的排序方法是稳定的;反之,若可能使排序后的序列中R,领先于R;,则称所用的排序方法是不稳定的。
由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程,这里先集中讨论内部排序。
内部排序的方法很多,但就其全面性能而言,很难提出一种被认为是最好的方法,每一种方法都有各自的优缺点,适合在不同的环境(如记录的初始排列状态等)下使用。如果按排序过程中依据的不同原则对内部排序方法进