• 排序算法之基数排序


    基本思想:
    BinSort想法非常简单,首先创建数组A[MaxValue];然后将每个数放到相应的位置上(例如17放在下标17的数组位置);最后遍历数组,即为排序后的结果。

    过程:

    问题: 当序列中存在较大值时,BinSort 的排序方法会浪费大量的空间开销。

    基本思想: 基数排序是在BinSort的基础上,通过基数的限制来减少空间的开销。

    (1)首先确定基数为10,数组的长度也就是10.每个数都会在这10个数中寻找自己的位置。
    (2)不同于BinSort会直接将数21放在数组的下标21处,基数排序是将21分开为2和1,第一轮排序根据最末位放在数组的下标1处,第二轮排序根据倒数第二位放在数组的下标2处,然后遍历数组即可。

    代码:

    public static void RadixSort(int A[],int temp[],int n,int k,int r,int cnt[]){
    
       //A:原数组
       //temp:临时数组
       //n:序列的数字个数
       //k:最大的位数2
       //r:基数10
       //cnt:存储bin[i]的个数
    
       for(int i=0 , rtok=1; i<k ; i++ ,rtok = rtok*r){
    
           //初始化
           for(int j=0;j<r;j++){
               cnt[j] = 0;
           }
           //计算每个箱子的数字个数
           for(int j=0;j<n;j++){
               cnt[(A[j]/rtok)%r]++;
           }
           //cnt[j]的个数修改为前j个箱子一共有几个数字
           for(int j=1;j<r;j++){
               cnt[j] = cnt[j-1] + cnt[j];
           }
           for(int j = n-1;j>=0;j--){      //重点理解
               cnt[(A[j]/rtok)%r]--;
               temp[cnt[(A[j]/rtok)%r]] = A[j];
           }
           for(int j=0;j<n;j++){
               A[j] = temp[j];
           }
       }
    }
    

      

  • 相关阅读:
    11.01T3 实数二分
    11.01T2 树状数组维护动态LIS
    11.1T1打表
    10.31T4 HAOI2010最长公共子序列 计数+容斥原理
    10.31T3 其他算法思想
    10.31T2 点双联通分量+预处理前缀+二分答案
    10.31T1 二分图
    10.30T3 换根
    10.30T2 二分+前缀和(后缀和)
    10.30T1 期望DP
  • 原文地址:https://www.cnblogs.com/maohaitao/p/11399371.html
Copyright © 2020-2023  润新知