10.6.2 基数排序的两种实现方法

  有的逻辑关键字可以看成由若干个关键字复合而成的。例如,若逻辑关键字k是数值,且其值都在0到999的范围内,则可把k中的每一个十进数字看成一个关键字,即认为k由三个关键字(K0,K1,K2) 组成,其中K0是百位数,K1是十位数,K2是个位数;又若关键字k是由五个字母组成的单词,则可看成是由五个关键字(K0,K1,K2,K3,K4) 组成,其中每个字母Kj都是一个关键字,K0是最高位,K4是最低位。现依照"LSD法"进行排序,并且由于如此分解而得的每个关键字Kj都在相同的范围内,则可以按"分配"和"收集"的方法进行。

  一般情况下,假设记录的逻辑关键字由 d 个"关键字"构成,每个关键字可能取 rd 个值,则只要从最低位关键字起,按关键字的不同值将记录"分配"到 rd 个队列之后再"收集"在一起,如此重复 d 趟,最终完成整个记录序列的排序。按这种方法实现的排序称为"基数排序",其中"基数"即 rd 指的是"关键字"的取值范围,上述两种关键字的基数分别为"10"和"26"。
 
 

  基数排序是一种借助"多关键字排序"的思想来实现"单逻辑关键字排序"的内部排序算法。
 
    例如,对关键字为(78,09,63,30,74,89,94,25,05,69,18,83)的记录序列需进行两趟"分配"和"收集"。第一趟分配对"个位数"进行,根据每个记录关键字个位数的值(0,1, …,9),将它们分配到10个队列中去,然后进行第一趟收集,即依个位数为0,1,…,9的顺序将记录联接在一起,之后再按关键字的"十位数"进行分配,第二趟收集的结果即为记录的有序序列。     基数排序的过程如动画所示。动画