基数排序
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<<" "; } }
运行结果:
以上是关于基数排序的主要内容,如果未能解决你的问题,请参考以下文章