码迷,mamicode.com
首页 > 编程语言 > 详细

基数排序

时间:2020-05-14 09:13:43      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:http   str   int   dig   相同   curd   out   for   tmp   

基数排序(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<<" ";
    }
}

运行结果:

技术图片

 

基数排序

标签:http   str   int   dig   相同   curd   out   for   tmp   

原文地址:https://www.cnblogs.com/FdWzy/p/12886064.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!