排序算法之(8)--基数排序

介绍

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。

比如四个数字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);
}

猜你喜欢

转载自blog.csdn.net/hiudawn/article/details/80379391