/* 待排数组:data_array[] = {6, 11, 33, 7, 10, 4, 21}; 对data_array中的每个数对10求余,并将余数放入二维数组redix_array中 -------------------------------------------------------- redix_array(方框号内的数字代表求余后的index): [0]: 10 [1]: 11, 21 [2]: 0 [3]: 33 [4]: 4 [5]: 0 [6]: 6 [7]: 7 [8]: 0 [9]: 0 -------------------------------------------------------- 将redix_array中的数从上到下,从左到右依次放入data_array中 data_array = {10, 11, 21, 33, 4, 6, 7} 对data_array中的每个数的十位进行求余,并将余数放入redix_array中 -------------------------------------------------------- redix_array: [0]: 4, 6, 7 [1]: 10, 11 [2]: 21 [3]: 33 [4]: 0 [5]: 0 [6]: 0 [7]: 0 [8]: 0 [9]: 0 -------------------------------------------------------- 再次将redix_array中的数一次插入到data_array中,即: 4, 6, 7, 10, 11, 21, 33(排序结束) 算法复杂度为(数组的长度 + 数组长度(从redix_array收集所有数字放入data_array中 )) * 数组中最大位数(维数) 即 O(2 * d * n) */ #include <stdio.h> static int get_index(int number, int count) { int tmp_number = 1; for(int i = 0; i < count; ++i) tmp_number *= 10; return number / tmp_number % 10; } void redix_sort(int data_array[], int len) { // 最大求余次数 const int k = 10; // 基数的范围 const int redix_num = 10; int redix_array[redix_num][len + 1]; for(int index = 0; index < redix_num; ++index) { // 初始化计数变量 redix_array[index][0] = 0; } for(int i = 0; i < k; ++i) { for(int j = 0, index; j < len; ++j) { index = get_index(data_array[j], i); redix_array[index][++redix_array[index][0]] = data_array[j]; } for(int index = 0, j = 0; index < redix_num; ++index) { for(int k = 1; k <= redix_array[index][0]; ++k) { data_array[j++] = redix_array[index][k]; } // 将计数变量清0 redix_array[index][0] = 0; } } } void main() { int data_array[] = {5, 1, 33, 4, 100, 5}; redix_sort(data_array , 6); for(int i = 0; i < 6; ++i) printf("%d ", data_array[i]); } 运行结果: 1 4 5 5 33 100