基数排序(Radix sort)

14 篇文章 0 订阅
11 篇文章 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;
            }
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值