基数排序算法是箱排序(桶排序)的改进和推广。
int find_max(int a[], int len) //查找长度为len的数组的最大元素
{
int max = a[0];
for(int i = 1; i < len; i++)
{
if(max < a[i])
max = a[i];
}
return max;
}
//计算number有多少位
int digit_number(int number)
{
int digit = 0;
do
{
number /= 10;
digit++;
}while(number != 0)
return digit;
}
//返回number上第Kth位的数字
int Kth_digit(int number, int Kth)
{
number /= pow(10, Kth);
return number % 10;
}
//对长度为len的数组进行基数排序
void radix_sort(int a[], int len)
{
int* temp[10]; //指针数组,每一个指针表示一个箱子
int count[10] = {0,0,0,0,0,0,0,0,0}; //用于存储每一个箱子装有多少元素
int max = find_max(a, len); //取得序列中最大整数
int maxDigit = digit_number(max); //得到最大整数的位数
int i, j, k;
for(i = 0; i < 10; i++)
{
temp[i] = new int[len]; //使每一个箱子能装下len个int元素
memset(temp[i], 0, sizeof(int)*len);//初始化为0
}
for(i = 0; i < maxDigit; i++)
{
memset(count, 0, sizeof(int)*10);//每次装箱前把count清空
for(j = 0; j < len; j++)
{
int xx = Kth_digit(a[i], i);//将数据安装位数放入到暂存数组中
temp[xx][count[xx]] = a[j];
count[xx]++;
}
int index = 0;
for(j = 0; j < 10; j++)
{
for(k = 0; k < count[j]; k++) //把箱子里所有的元素都取回到原始数组
{
a[index++] = temp[j][k];
}
}
}
}