基数排序

Posted fdwzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基数排序相关的知识,希望对你有一定的参考价值。

基数排序(radix sort):

对个位数先排序,再对十位数排序,以此类推。。

如果数据不满足位数相同,要对不够位数的数字前面补0(或者做类似处理)。

时间复杂度O(nk)其中n为数字个数,k为最多的数字位数。

void RadixSort(vector<int>& nums){
    int maxDigits=1;
    for(const int& num:nums){   //找到最长数字位数
        maxDigits=max(maxDigits,int(to_string(num).size()));
    }
    int tmp[11][100]={0};   //临时桶,分别对应0~9数字
    int radix=1,curDigit=0;    //从倒数第一位(个位)开始
    while(curDigit<maxDigits){
        int cnt[11]={0};    //cnt[i]=k:当前轮次第i个桶已经放了k个数字
        for(const int& num:nums){
            if(num>=radix){
                int n=(num/radix)%10;    //考察数字为n
                tmp[n][cnt[n]]=num; //放入n对应的桶
                cnt[n]++;   //n对应的桶增加一个元素
            }
            else{   //当前要考察的位是0
                tmp[10][cnt[10]]=num;
                cnt[10]++;
            }
        }
        //按顺序放回原数组,其中先放回当前考察位为0的
        int index=0;
        for(int i=0;i<cnt[10];++i){
            nums[index++]=tmp[10][i];
        }
        for(int i=0;i<10;++i){
            for(int j=0;j<cnt[i];++j){
                nums[index++]=tmp[i][j];
            }
        }
        curDigit++; //下次循环继续考察靠前的一位
        radix*=10;  //基数*10
    }
    for(const int& num:nums){
        cout<<num<<" ";
    }
}

运行结果:

技术图片

 

以上是关于基数排序的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-排序之基数排序(使用java代码实现)

基数排序:基数排序中的“组”是啥意思?

算法-java代码实现基数排序

改变基数排序基础?

LSD基数排序c++代码

为啥我的基数排序 JAVA 实现比快速排序慢?