一、基数排序的思想
基数排序也称“桶排序”。
它的基本思想就是:假设一组待排序数据,先对于数据基于个位排序,然后是基于百位排序,基于千位排序,最后使整个序列有序。
二、图解基数排序
给定一组待排序序列
[51 26 7 33 27 534 7648 649 67 49]
1、第一趟排序
按每个数组的个位数字归到相应的桶里,如下图所示:
第一趟排序过后将每个桶里的数据按顺序摘出来,新的序列为:
[51 33 534 26 7 27 67 7648 649 69]
这样这组数据就按个位数字排列有序了。
2、第二趟排序
按新生成的数组的十位数字归到相应的桶里,如下图所示:
接着按顺序将数字摘出来,得到新的序列为:
[7 26 27 33 534 7648 649 49 51 67]
3、第三趟排序
按新生成的数组的百位数字归到相应的桶里,如下图所示:
接着继续将每个数字按顺序摘出来得到新的序列:
[7 26 27 33 49 51 67 534 7648 649]
4、第四趟排序
按新生成的数组的千位数字归到相应的桶里,如下图所示:
接着继续将每个数字摘出来得到新的序列:
[7 26 27 33 49 51 67 534 649 7648]
这样整个序列就排列有序了。
以上就是基数排序的整个过程。
三、代码实现
//个位代表1 十位代表2 百位代表3
//求最大位数
int GetNumFin(int arr[],int len)
{
int max = -1;
int i = 0;
int count = 0;
for(i; i < len; i++)
{
if(arr[i] > max)
{
max = arr[i];
}
}
while(max != 0)
{
max = ma / 10;
count ++;
}
}
//获取哪一位的数字
int GetFinNumber(int val, iint pos)
{
return val / (pow(10.0,pos));//求10的几次方
}
void Radix(int arr[],int len,int fin)
{
int* bucket[10];
int i = 0;
int finnum;//代表位数的数字
int count[10] = {};//代表每个桶当前可插入的元素的下标或者当前桶中的元素
int arrindex = 0;
int buckectindex = 0;
for(i; i < 10; i++)
{
buckect[i] = (int*)malloc(sizeof(int)*len - 1);
}
for(i = 0; i < len; i++)
{
finnum = GetFinNumber(arr[i],fin);
buckect[finnum][count[finnum]] = arr[i];
count[finnum]++;
}
for(i = 0; i < 10; i++)
{
buckect = 0;
while(count[i] != 0)
{
arr[arrindex] = buckect[i][buckectindex];
buckectindex++;
arrindex++;
count[i]--;
}
}
for(i = 0; i < 10; i++)
{
free(buckect[i]);
}
}
void Radixsort(int arr[], int len)
{
int Maxfin = GetMaxNumFin(arr, len);
int i = 0;
for(i; i < Maxfin; i++)
{
Radix(arr, len, i);
}
}