zoukankan      html  css  js  c++  java
  • 排序之基数排序

    基数排序:

      基数排序的思想就是将待排数据中的每组关键字依次进行桶分配
    基数排序:LSD和MSD方法。LSD的基数排序适用于位数小的数列,如果位数多,使用MSD效率会更高。
    MSD与LSD相反,由高位数为基底开始分配。
    LSD为例:73, 22, 93, 43, 55, 14, 28, 65, 39, 81
    首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中。
    接下来将这些桶子中的数值重新串接起来,成为以下的数列:81, 22, 73, 93, 43, 14, 55, 65, 28, 39
    接着再进行一次分配,这次是根据十位数来分配:

     1 int maxbit(int data[], int n) //辅助函数,求数据的最大位数
     2 {
     3     int d = 1; //保存最大的位数
     4     int p = 10;
     5     for(int i = 0; i < n; ++i)
     6     {
     7         while(data[i] >= p)//复杂度(dN)
     8         {
     9             p *= 10;
    10             ++d;
    11         }
    12     }
    13     return d;
    14 }
    15 
    16 void radixsort(int data[], int n) //基数排序
    17 {
    18     int d = maxbit(data, n);//求得数组中所有的数据的最大位数
    19     int *tmp = new int[n];//存放每一位基数排序的结果
    20     int *count = new int[10]; //计数器
    21     int i, j, k;
    22     int radix = 1;//关键字
    23     for(i = 1; i <= d; i++) //进行d次排序
    24     {
    25         for(j = 0; j < 10; j++)
    26             count[j] = 0; //每次分配前清空计数器
    27         for(j = 0; j < n; j++)
    28         {
    29             k = (data[j] / radix) % 10; //统计每个桶中的记录数
    30             count[k]++;
    31         }
    32         for(j = 1; j < 10; j++)
    33             count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶,为count[k]在tmp中预留位置。把桶累计起来。
    34         for(j = n - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中
    35         {
    36             k = (data[j] / radix) % 10;
    37             tmp[count[k] - 1] = data[j];//把桶串起来
    38             count[k]--;
    39         }
    40         for(j = 0; j < n; j++) //将临时数组的内容复制到data中
    41             data[j] = tmp[j];
    42         radix = radix * 10;//每次更新关键字
    43     }
    44     delete[]tmp;
    45     delete[]count;
    46 }
  • 相关阅读:
    python3下搜狗AI API实现
    辽宁移动宽带体验及魔百盒M101s-2刷机
    年会抽奖系统-支持作弊,指定中奖
    论python3下“多态”与“继承”中坑
    fiddler抓手机报文的配置指南
    微软BI套件
    IntelliJ IDEA 2018 Community(社区版)创建J2EE项目+Tomcat9部署
    Spring.net的Demo项目,了解什么是控制反转
    manjaro安装virtualbox教程
    Debian9 安装后的配置笔记
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/8399685.html
Copyright © 2011-2022 走看看