/*
待排数组: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
基数排序
最新推荐文章于 2023-04-13 11:24:26 发布