排序算法总结(9)--基数排序

原创 2017年05月23日 18:19:17

一、简介

基数排序不是比较排序,依赖于计数排序。假设待排序序列中最大数字有d位数字,基数排序首先将所有元素拆分成d个关键字,每个关键字是元素的每位上的数字,例如257,拆分成3个关键字,2,5,7,如果位数不够,用0补全。对每一位的关键字进行计数排序。
排序时有两种解决方案:
最高位优先法(MSD)(Most Significant Digit first)
最低位优先法(LSD)(Least Significant Digit first)
这里以LSD为例。

二、伪代码

radixSort(A,radix,d)
    //A是待排序数组,radix是容器个数,d是数字位数
    for i=1 to d
        对第i位数字进行计数排序

三、代码实现

public static void radixSort(int[] A,int radix,int d){
        //给一个缓存数组
        int [] temp=new int[A.length];
        //给出容器数组
        int [] buckets=new int[radix];
        //对每位关键字进行计数排序
        int rate=1;
        for(int i=0;i<=d;i++){
            //将A中元素复制到temp中
            System.arraycopy(A, 0, temp, 0, A.length);
            //重新初始化buckets
            Arrays.fill(buckets,0);

            int subKey;
            //计算第i位关键字并统计
            for(int j=0;j<A.length;j++){
                subKey = (temp[j] / rate) % radix;  
                buckets[subKey]++; 
            }

            for(int j=1;j<radix;j++){
                buckets[j]=buckets[j]+buckets[j-1];
            }
            for (int m =A.length - 1; m >= 0; m--) {  
                subKey = (temp[m] / rate) % radix;  
                A[--buckets[subKey]] = temp[m];  
            }  
            rate *= radix;  
        }
    }

四、注意事项

1、当d比较大时,使用MSD效率更高
2、基数排序的基础是计数排序,因为计数排序是稳定的。
3、对每个关键字进行计数排序的时间复杂度是O(n+k),所以基数排序的时间复杂度是O(d(n+k))。
4、MSD基数排序是从最高位开始对序列进行分组,到最低位为止。但是其实现过程是和LSD基数排序不同的,排序过程中需要用到递归函数。首先统计所有元素最高位的关键字,如果某个关键字的个数大于1,需要对这些关键字所在的元素递归的统计下一位关键字,直到所有关键字的个数小于等于1,回溯收集数据。

基数排序法算法分析及实现

基数排序法简介 「基数排序法」(radix sort)属于「分配式排序」(distribution sort),基数排序法又称「桶子法」(bucket sort)或bin sort,顾名思义,它是透...
  • u011439689
  • u011439689
  • 2014年01月05日 14:34
  • 1195

排序算法c语言描述---基数排序

排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析。 文章规划: 一。通过自己对排序算法本身的理解,对每个方法写个小测试程序。 ...
  • hitwhylz
  • hitwhylz
  • 2013年08月14日 20:25
  • 12226

【算法】基数排序

计数排序 学习基数排序之前首先学习计数排序。 计数排序假设每个元素都是在0到k之间的一个整数。 基数排序的基本思想,对于每个元素x,如果我们知道了小于x的元素的个数,就可以确定输出数组中元素x的...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2015年11月11日 15:01
  • 2629

一步一步写算法(之基数排序)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     基数排序是另外一种比较有特色的排序方式,它是怎么排序的呢?我们可以按照下面的...
  • feixiaoxing
  • feixiaoxing
  • 2011年10月15日 21:32
  • 43250

【数据结构与算法】——基数排序

基数排序 基本思想:它是一种非比较排序。它是根据位的高低进行排序的,也就是先按个位排序,然后依据十位排序……以此类推。 时间复杂度: 分配需要O(n),收集为O(r),其中r为分配后链表的个数,以r=...
  • u010164936
  • u010164936
  • 2015年10月31日 18:49
  • 714

python数据结构学习笔记-2016-11-24-02-基数排序

12.4 基数排序          基数排序(radix sort)是一种只适用于数字或字母类型的排序方法,它检查数字或字母的每一位,将之分类,按照位数的特定顺序,来将元素排列。        ...
  • baidu_21088863
  • baidu_21088863
  • 2016年12月31日 18:48
  • 403

基数排序 java代码实现

基数排序的基本思想:   设置r个队列(r为进制数,例如十进制r=10),队列编号分别为0,1,2,… ,r-1;首先按数据元素关键字最低位上的数字值依次把n个数据元素分配到r个队列中(入队); ...
  • yxmmao
  • yxmmao
  • 2016年06月12日 21:36
  • 1365

基数排序及C语言实现

基数排序及C语言实现
  • bing_bing304
  • bing_bing304
  • 2014年11月29日 21:53
  • 2113

排序算法 - 基数排序(C++)

/* * Get the spcific digit of given number. * For example, number 234, * the 0st digit is 4, *...
  • kingbird_Wang
  • kingbird_Wang
  • 2012年04月07日 15:36
  • 5524

基数排序算法分析

基数排序:主要思想是把数字按位进行比较,从个位,十位... 到最高位,取得每个位的单个数字逐一进行比较和移动。 由于整数也可以用字符串表达(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能...
  • wangzhiyu1980
  • wangzhiyu1980
  • 2011年12月04日 15:56
  • 4694
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序算法总结(9)--基数排序
举报原因:
原因补充:

(最多只允许输入30个字)