10.6.1 多关键字的排序

 一般情况下,对多关键字排序的定义为:

  假设含有 n 个记录的序列为:
   

  每个记录 Ri 中含有 d 个关键字,则称该记录序列对关键字有序是指:对于序列中任意两个记录 Ri 和 Rj(1≤i<j≤n)都满足下列有序关系:
   

  其中 K0 被称作最主位关键字,Kd-1 被称作最次位关键字。

  通常实现多关键字排序可以有两种策略:一是最主位优先MSD法),另一是最次位优先LSD法)。

  最主位优先的作法是:先对最主位关键字K0进行排序,得到若干子序列,其中每个子序列中的记录都含相同的K0值,之后分别就每个子序列对关键字K1进行排序,致使K1值相同的记录构成长度更短的子序列,依次重复,直至就当前得到的各个子序列对 Kd-2 进行排序之后得到的每个子序列中都具有相同的关键字,分别对这些子序列按 Kd-1 从小到大进行排序,最后由这些子序列依次相连所得序列便是排序的最后结果,即对关键字 有序。
 
 

  思考题 假如你手中有一副扑克牌,若要将它们排列成一个有序序列,你准备怎么做?
 

  你可能是先按不同"花色"将它们分成有次序的四堆,然后分别对每一堆按"面值" 大小(2<3<…<A)排列有序。若将"花色"视作K0,将 "面值" 视作K1,这种整理方法即为"MSD"的作法。

  那么你现在换一种方法试试,先将手中的牌按 "面值"分成13堆,然后将这13堆牌从大到小收集在一起("A"在"K"之上,"K"在"Q"之上,……,最下面的是4张"2"),再重新按不同"花色"分成4堆,最后将这4堆牌按自小至大的次序收集在一起(在最上面,在最下面),此时你手中的牌已是从上到下有序的了。显然,这种整理方法即为"LSD"的作法。

  可见按最次位优先进行排序时,对每一位关键字的排序不一定要用前几节所述的内部排序方法进行,而是用先按类"分配"再依次"收集"的方法进行。
 
 
    最次位优先的作法是,在继续对"前一位"排序时不需要将当前所得对其后一位有序的序列分割成若干子序列进行,而是整个序列依次对 Kd-1、对 Kd-2 直至对K0进行排序即可,如右侧示例所示。     例如,对含(系别、班号和班内序列号)三个关键字的记录序列按"最低位优先"进行排序的过程如动画所示。动画