假设原来有一串数值如下所示:
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
代码:
//获取末尾数 int getmantissa(int num, int digits) { int temp = 1; for (int x = 0; x < digits - 1; ++x) temp *= 10; return (num / temp) % 10; } void radixsort(struct SQ_LIST *v) { int digit = 1; //获取位数 int save[10][100001]; for (int i = 0, p = 10; i < v->Length; ++i) while (v->elem[i].ID >= p) { p *= 10; ++digit; } //初始化二位数组每行的首元 for (int x = 0; x < 10; x++) { save[x][0] = 0; } //基数排序 for (int i = 1; i <= digit; i++) { for (int x = 0; x < v->Length+1; ++x) { int mantissa = getmantissa(v->elem[x].ID, i); int index = ++save[mantissa][0]; //每行的首元存储每行数据量 save[mantissa][index] = v->elem[x].ID; } //合并 for (int i = 0, x = 0; i < 10; i++) { for (int j = 0; j < save[i][0]; ++j) v->elem[x++].ID = save[i][j + 1]; save[i][0] = 0; //重新初始化每行首单元 } } }
时间: 2024-10-27 21:49:26