(以下介绍内容转自百科)
基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
以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
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。
#include <iostream> #include <stdlib.h> using namespace std; //存放位数上的数所对应的数组 int **temp; int *forIndex; //用max来确定最大位数,用min来确定取哪个位置的数 int radixSort(int t[], const int &length, int max, int min) { if((min + 1) > max) return 0; //初始化中间变量 for(int i = 0; i < 10; i++) { forIndex[i] = 0; } static int step = 0; //用于取得某个固定位的值所需的除法位数 step = step * 10 ? step * 10 : 1; //将数组按照指定位数上的数分配到对应的中间变量数组中 int index, j = 0; for(int i = 0; i < length; i++) { index = t[i] / step % 10; temp[index][forIndex[index]] = t[i]; forIndex[index]++; } //将中间变量数组中的数重新赋值到数组中 int k = 0; for(int i = 0; i < 10; i++) { for(int j = 0; j < forIndex[i]; j++) { t[k] = temp[i][j]; k++; } } min++; radixSort(t, length, max, min); } template <typename T> int printArray(T *const t, int len) { for(int i = 0; i < len; i++) { cout << t[i] << ';'; } cout<<endl; } int main(int argc, char *argv[]) { int c[10] = {22,21,10,13,140,4,3,2,1,0}; temp = new int*[10]; for(int i = 0; i < 10; i++) { temp[i] = new int[sizeof(c)/sizeof(int)]; } forIndex = new int[10]; radixSort(c, sizeof(c)/sizeof(int), 3, 0); printArray(c, sizeof(c)/sizeof(int)); delete temp; delete forIndex; return 0; }