基数排序


/*
待排数组: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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值