版权声明:转载请注明原出处啦QAQ(虽然应该也没人转载): https://blog.csdn.net/hzk_cpp/article/details/83689670
一.简介.
基数排序是一种优秀的排序方法.这种排序的时间复杂度比较难以描述,若分成了r位,每一段数的大小为m,则时间复杂度为
基数排序的思想就是对一个数或一个字符串按为拆分,从最后一位开始往前一直排序直到序列有序.
二.算法引入.
我们知道,基于比较的排序算法的时间复杂度下限是,而桶排序一类的排序的时间复杂度时间复杂度为,受到m的影响过大,我们能否让一种排序的时间复杂度收到m的影响小一些呢.
基数排序就是一种很好的排序.
基数排序的思路是将一个数字分成r位,然后将所有数的最后一位开始放入桶中,取出后最后一位就是有序的了,然后不断往前重复这一动作就可以做到有序了.
比如说我们有n个三位数,先按照最后一位排序,然后按照第二位排序,最后按照最高位排序就可以让这个东西做到有序.
我们发现这样就可以做到一个神奇的复杂度,我们若要对范围为的n个数排序,我们只需要在十进制下6位为1位塞进桶中排序就可以做到排序了.
三.代码实现.
代码如下:
void radix_sort(int L,int R,int r){ //给区间[L,R]排序,基数为r
int maxx=0;
for (int i=L;i<=R;++i)
maxx=max(maxx,a[i]);
for (int g=1;g<=maxx;g*=r){
for (int i=0;i<=r;++i)
cnt[i]=num[i]=0;
for (int i=L;i<=R;++i)
++cnt[a[i]/g%(g*r)];
for (int i=1;i<=r;++i)
num[i]=num[i-1]+cnt[i-1];
for (int i=1;i<=n;++i)
tmp[++num[a[i]/g%(g*r)]]=a[i];
for (int i=1;i<=n;++i)
a[i]=tmp[i];
}
}