排序——基数排序技术
基数排序是一种借助于多关键码排序的思想,是将单关键码按基数分成“多关键码”进行排序的方法。它的排序思想不是通过关键码之间的比较而是通过多次的“分配”和“收集”来完成的。
1、多关键码排序
举个大家都很熟悉的扑克牌的例子:扑克牌中的52张牌,可按花色和面值分成两个属性,设其大小关系为:
花色:梅花 <方块<红心 <黑心
面值:2<3<4<5<6<7<8<9<10<J<Q<K<A。
若对扑克牌按花色、面值减小升序排序,得到如下序列:
梅花 2,3,……,A,方块 2,3,……,A,红心 2,3,……,A,黑心 2,3,……,A
即两张牌若花色不同不论面值怎样,花色低的那张牌小于花色高的,只有在同花色情况下大小关系才由面值的大小确定。这就是根据多关键码排序。
设排序表中有n个记录,每个元素的每个记录的关键码包含了d位,其中称为主位关键码,称为最次位关键码。
多关键码排序安装从最主位关键码到最次位关键码或倒序顺序逐次排序,分两种方法:
1)最主位优先(Most Significant Digit First, MSD)法。先按主位关键码排序分组,同一组记录中关键码相等,在对各组按次位关键码排序分成子组,之后对后面的关键码继续这样的排序分组直到按最次位关键码对各子表排序后在将各组连接起来,便得到一个有序序列。上例扑克牌按花色、面值排序中介绍的方法即MSD法。
2) 最次位优先(Least Significant Digit First)法,简称LSD法。与MSD取关键码相反。
2、链式基数排序
链式基数排序是用链表作为排序表的存储结构。将关键码拆分为若干项,每项作为一个“关键码”,则对单关键码的排序可按多关键码排序方法进行。比如,关键码为4位的整数,可以每位对应一项,拆分成4项;又如,关键码由5个字符组成的字符串,可以每个字符作为一个关键码。由于这样拆分后每个关键码都在相同的范围内(对数字是0~9,字符是‘a’~'z'),称这样的关键码可能出现的符号个数为“基”,记作RADIX。上述取数字为关键码的“基”为10;取字符为关键码的“基”为26。基于这以特许,用LSD法排序较为方便。
基数排序思想是:从最低位关键码起,按关键码的不同值将序列中的记录“分配”到RADIX个队列(组)中,然后在“收集”称之为一趟排序。第1趟之后,排序表中的记录已按最低位关键码有序,再对次最低位关键码进行一趟“分配”和“收集”,如此知道对最高位关键码进行一趟“分配”和“收集”,则排序表按关键码有序。
例:设排序表记录关键码为278 109 063 930 589 184 505 269 008 083 以链式存储,其基数排序过程如下图示:
分配时,根据本趟关键码当期位的值分配到相应的组,在同一组内记录的顺序也是按分配顺序有序的即后分配到同一组内的大于先分配到组内的,在这里用队列表示一个组,而组内记录的顺序则用每个记录的指针域连接起来,形成一个链队,共需要RADIX个队列。