基数排序的讲解

版权声明:转载请注明原出处啦QAQ(虽然应该也没人转载): https://blog.csdn.net/hzk_cpp/article/details/83689670

一.简介.

基数排序是一种优秀的排序方法.这种排序的时间复杂度比较难以描述,若分成了r位,每一段数的大小为m,则时间复杂度为O((n+m)r)

基数排序的思想就是对一个数或一个字符串按为拆分,从最后一位开始往前一直排序直到序列有序.

二.算法引入.

我们知道,基于比较的排序算法的时间复杂度下限是O(nlogn),而桶排序一类的排序的时间复杂度时间复杂度为O(n+m),受到m的影响过大,我们能否让一种排序的时间复杂度收到m的影响小一些呢.

基数排序就是一种很好的排序.

基数排序的思路是将一个数字分成r位,然后将所有数的最后一位开始放入桶中,取出后最后一位就是有序的了,然后不断往前重复这一动作就可以做到有序了.

比如说我们有n个三位数,先按照最后一位排序,然后按照第二位排序,最后按照最高位排序就可以让这个东西做到有序.

我们发现这样就可以做到一个神奇的复杂度,我们若要对范围为10^{12}的n个数排序,我们只需要在十进制下6位为1位塞进桶中排序就可以做到O(2(n+10^6))排序了.

三.代码实现.

代码如下:

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];
  }
}

猜你喜欢

转载自blog.csdn.net/hzk_cpp/article/details/83689670