介绍
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。
比如四个数字112 311 111 12(即012)
第一趟按个位排完是311 121 112 12
第二趟按十位排完是311 112 12 121
第三趟按百位排完是12 112 121 311
bingo,搞定
代码
//辅助函数:交换两个变量
void swap(int*a,int*p)
{
int temp = *a;
*a = *p;
*p = temp;
}
//基数排序
//radix sort,说是桶排bucket sort的一种,具体没仔细查证
//对于整数,按个位数先排,再排十位,再排百位..
//需要和原数组一样的额外的空间,用来临时存那些数字
void radixSort(int* arr,int len,int max)
{
int n = 1;//位数 1 10 100 1000 ...
int (*bucket)[len] = (int(*)[len])malloc(10*len*sizeof(int));//int[某数位为某尾数的所有数字][某尾数]
int count[10] = {0};//某个数位0-9
while(n<=max)
{
int i = 0;
int digit;
for(i = 0;i<len;i++)
{
digit = (arr[i]/n)%10;//某个数位的数字,如n=10,arr[i]为293,则这里就是求十位,即=9
bucket[digit][count[digit]]= arr[i];
count[digit] += 1;//记得每次找到一个位数为digit的,数量+1
}
//放回原数组
i = 0;
for(digit = 0;digit<10;digit++)
{
int j = 0;
for(j = 0;j<count[digit];j++)
{
arr[i++] = bucket[digit][j];
}
count[digit] = 0;//清空那个桶,准备下次放
}
n*=10;//位数10倍变化
}
free(bucket);
}