基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法。
1.多关键字排序
举个例子:要比较三个家族哪个更厉害,你决定通过官职来比较三代来确定.
赵家 爷爷:县长(3)爸爸:村长(2)儿子:省长(5)
孙家 爷爷:市长(4)爸爸:镇长(2)儿子:主席(6)
田家 爷爷:省长(5)爸爸:市长(4)儿子:村长(1)
要比较厉害,最先看的就是当代,爷爷再厉害也退休了,只是以前当的官,爸爸厉害上升的空间也很小了.而儿子潜力大空间大.所以相比之下儿子比爸爸的影响力大,爸爸比爷爷的影响力大.换个高端的词就是:权重.
在这个例子中:
儿子是:主关键字(K0)爸爸是:次关键字(K1)爷爷是:最次关键字(K2)
儿子的权重>爸爸的权重>爷爷的权重
1.最高位优先MSD法(本例中:从儿子开始比,到爷爷结束)
先对K0进行排序,并按K0的不同值将记录序列分成若干子序列之后,分别对K1进行排序,......,依次类推,直至最后对最次位关键字排序完成为止。
2.最低位优先LSD法(本例中:从爷爷开始比,到儿子结束)
先对Kd-1进行排序,然后对Kd-2进行排序,依次类推,直至对最主位关键字K0排序完成为止。
2.基数排序
基数排序又称为”桶子法”,它是根据排列元素的”关键字”,将元素分配至对应的”桶”中,藉此达到排序的目的.
就比如说:
当当网现有一堆书籍快递需要我们帮他排出它们的派送时间排行.假设我们根据收货地点距发货地址距离将依次将省,市,区划分为0-9十个级别,级别越高路程越远,到货时间越长.例如:陕西省(9)西安市(9)长安区(9),则这件快递所有当中路途最远,到货最慢的.
快递级别如下:
《AAA》654,《BBB》789,《CCC》091,《DDD》432,《EEE》567,《FFF》674,《GGG》093,《HHH》509。
以LSD(见上文)排序为例:
LSD的基数排序适用于位数较小的数列排序,如果位数多的话,使用MSD效率会比较好.接下来我们再来看看LSD
同样背景以下述数据为例:
快递级别如下:
《AAA》6(省)5(市)4(区),《BBB》789,《CCC》091,《DDD》432,《EEE》569,《FFF》674,《GGG》093,《HHH》509,《III》568。
MSD排序(以省级别为5为例):
MSD基数排序是通过”桶中建桶”的方式实现自前向后的”收集,排序”,先利用权重高的关键字(省级别)将排序元素放置大桶中(第一次),再在各个桶中放入小桶(第二次),再利用次关键字进行元素”入桶”,如此往复.最后再从最深桶中依次取出,元素便已排好次序.