基数排序(Radix sort)

发布于:2023-01-30 ⋅ 阅读:(608) ⋅ 点赞:(0)

在这里插入图片描述

排序思路放一次取一次

1.创建(0~9)10个“桶”(队列);
2.遍历数组中的每个元素,从个位开始将数组元素放至相应号的桶中(如6501放进1号桶,1234放进4号桶);
3.再将每个桶中的元素拿出,当桶不是空的时候,在每个桶中,根据队列先进先出,依次将元素拿出放进数组;
4.再根据(百位,千位…),将元素放进对应的桶中,重复上面的步骤(放取次数根据最大元素的位数决定),最后一次取出放进数组后就排序好了。

代码的实现:

void radixSort(int arr[],int N){
    /*遍历找出数组中最大元素*/
    int max = arr[0];
    for(int i=0;i<N;i++){
        if(arr[i]>max){
            max = arr[i];
        }
    }
    /*求最大元素长度*/
    int maxLength = 0;
    while(max > 0){
        max /= 10;
        maxLength++;
    }
    /*创建(0~9)10个桶子*/
    int bucket[10][N];
    /*记录每个桶中有多少个元素,先将每个桶中元素个数置0*/
    int bucketElementCounter[N];
    for(int i = 0;i < N;i++){
        bucketElementCounter[i] = 0;
    }

    /*按个位,百位~放入对应桶中*/
    for(int i = 0,t =1;i < maxLength;i++,t*=10){
        for(int j = 0;j < N;j++){
            /*记录每轮排序各元素对应的桶号*/
            int num_bucket = arr[j]/t%10;
            /*放入桶*/
            bucket[num_bucket][bucketElementCounter[num_bucket]++] = arr[j];
        }

        /*取出(放一次取一次)*/
        for(int i = 0,j = 0,n = 0;i < 10;i++){
            if(bucketElementCounter[i]!=0){
                while(bucketElementCounter[i]){
                    arr[n++]=bucket[i][j++];
                    bucketElementCounter[i]--;
                }
                /*置零,保证每次从桶底的元素开始取出(队列:先进先出)*/
                j = 0;
            }
        }
    }
}