本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.基数排序
基数排序(radix sort)又称“桶子法”(bucket sort或bin sort)。分为LSD(Least Significant Digit first,最低位优先)和MSD(Most Significant Digit first,最高位优先)两种方式。
1.1.LSD
假设待排序列为:
73 | 22 | 93 | 43 | 55 | 14 | 28 | 65 | 39 | 81 |
---|---|---|---|---|---|---|---|---|---|
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0 | |||
---|---|---|---|
1 | 81 | ||
2 | 22 | ||
3 | 73 | 93 | 43 |
4 | 14 | ||
5 | 55 | 65 | |
6 | |||
7 | |||
8 | 28 | ||
9 | 39 |
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81 | 22 | 73 | 93 | 43 | 14 | 55 | 65 | 28 | 39 |
---|---|---|---|---|---|---|---|---|---|
接着再进行一次分配,这次是根据十位数来分配:
0 | ||
---|---|---|
1 | 14 | |
2 | 22 | 28 |
3 | 39 | |
4 | 43 | |
5 | 55 | |
6 | 65 | |
7 | 73 | |
8 | 81 | |
9 | 93 |
接下来将这些桶子中的数值再次重新串接起来,成为以下的数列:
14 | 22 | 28 | 39 | 43 | 55 | 65 | 73 | 81 | 93 |
---|---|---|---|---|---|---|---|---|---|
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
1.2.MSD
LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。