排序算法总结(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,回溯收集数据。

常见排序算法小结

     排序算法经过了很长时间的演变,产生了很多种不同的方法。对于初学者来说,对它们进行整理便于理解记忆显得很重要。每种算法都有它特定的使用场合,很难通用。因此,我们很有必要对所有常见的排序算法进行...
  • whuslei
  • whuslei
  • 2011-05-24 16:25:00
  • 94815

算法学习之排序学习之基数排序,计数排序及java实现

先介绍一下概念   计数排序和基数排序都是非比较排序,就是不用进行比较就能排序,相对于堆排序,快速排序,插入排序等都是比较排序,比较排序算法的最坏情况下届都要做0(nlgn)次的比较,堆排序和合并排...
  • lufeng20
  • lufeng20
  • 2012-09-05 15:29:59
  • 1527

排序算法实现以及比较

本文介绍了常用的内排序算法包括比较排序算法(插入排序、冒泡排序、选择排序、快速排序、归并排序、堆排序)和基于运算的排序算法(基数排序、桶排序)。分别对这些算法从算法思想、伪代码、复杂度和稳定性、算法的...
  • zhangph1229
  • zhangph1229
  • 2016-07-31 19:33:28
  • 1340

关于排序算法的优劣性比较

算法思路,排序优劣
  • stulcc
  • stulcc
  • 2016-09-15 22:01:55
  • 178

八大排序算法详解——基数排序

基本思想基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数...
  • cy__dream
  • cy__dream
  • 2017-02-08 20:33:08
  • 487

八大排序算法总结与java实现

原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总结,强行学习...
  • u010983881
  • u010983881
  • 2017-07-30 15:22:36
  • 2336

各排序算法对比

直接插入排序、折半插入排序、希尔排序。 冒泡排序、快速排序。 简单选择排序、堆排序。 归并排序、基数排序。...
  • qq_29305911
  • qq_29305911
  • 2017-09-09 09:54:38
  • 120

计数排序实现基数排序

计数排序来实现基数排序
  • zhangxiao93
  • zhangxiao93
  • 2016-04-15 10:14:11
  • 773

排序算法系列:基数排序

今天要说的这个排序算法很特殊,它不需要直接对元素进行相互比较,也不需要将元素相互交换,你需要做的就是对元素进行“分类”。这也是基数排序的魅力所在,基数排序可以理解成是建立在“计数排序”的基础之上的一种...
  • u013761665
  • u013761665
  • 2016-06-16 23:14:07
  • 23799

基数排序(C++版)

假设原来有一串数值如下所示: 73, 22, 93, 43, 55, 14, 28, 65, 39, 81 首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中: 0 1 81 ...
  • u012580566
  • u012580566
  • 2015-08-16 15:54:42
  • 4739
收藏助手
不良信息举报
您举报文章:排序算法总结(9)--基数排序
举报原因:
原因补充:

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