美文网首页
【排序算法】7.基数排序

【排序算法】7.基数排序

作者: bit_拳倾天下 | 来源:发表于2022-05-15 00:37 被阅读0次

基数排序(RadixSort)是桶排序的升级版,属于分配式排序。它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。

具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

基数排序示意图

在这个过程中创建桶进行辅助排序


特点

速度快
空间换时间,排序速度快

空间浪费巨大
因为排序基于桶,桶需要占据大量空间,一个长度为 length 的数组,它的桶就是一个 [10][length] 的二维数组(如果算上负数,那就需要 [19][length] 的二维数组)

不适合负数排序
因为桶是二维数组,第一维度代表的是每一位的数值,如果有负数会报错(如: new int[-10]),需要进行改造

java 实现:

public class RadixSortTest {
    public static void main(String[] args) {
        int[] input = {2,5,4,89,20,89,6,0,54,78,2};
        radixSort(input);
        PrintUtils.print(input);
    }

    public static void radixSort(int[] arr) {
        //桶
        int[][] bucket = new int[10][arr.length];
        //统计每个桶的有效元素个数
        int[] bucketCounter = new int[10];
        //位数
        int place = 0;
        int max = 0;
        for (int n = 0; n < arr.length; n++){
            if (arr[n] > max){
                max = arr[n];
            }
        }
        int maxLength = (max + "").length();
        for (int m = 0; m < maxLength; m++){
            //按位数,依次存入对应的桶中
            for (int i = 0; i < arr.length; i++){
                int placeValue = arr[i] / (int)Math.pow(10, place) % 10;
                bucket[placeValue][bucketCounter[placeValue]++] = arr[i];
            }
            place++;

            //从桶中取出,依次放回 arr
            int returnPointer = 0;
            for (int j = 0; j < 10; j++){
                int[] placeArr = bucket[j];
                for (int k = 0; k < bucketCounter[j]; k++){
                    arr[returnPointer++] = placeArr[k];
                }
                //还原 bucketCounter
                bucketCounter[j] = 0;
            }
        }
    }
}

时间复杂度

  • 最优时间复杂度:O(d(n+r))
  • 最坏时间复杂度:O(d(n+r))
  • 稳定性:稳定

相关文章

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • swift经典算法-基数排序

    基数排序算法 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子...

  • 基数排序(c++) to be continued

    [TOC] 参考 基数排序算法的实现与优化 clickhouse 实现的基数排序源码 基数排序的性能优化 Radi...

  • (转)排序算法

    排序算法点这里 数据结构与算法——计数排序、桶排序、基数排序

  • 非比较排序算法

    基数排序算法 基数排序是非比较排序算法,算法的时间复杂度是O(n). 相比于快速排序的O(nlgn),从表面上看具...

  • 【排序算法】7.基数排序

    基数排序(RadixSort)是桶排序的升级版,属于分配式排序。它的基本思想是:将整数按位数切割成不同的数字,然后...

  • 排序算法(十二)基数排序

    排序算法(十二)基数排序   基数排序(radix sort)是桶排序改进版,该算法是通过按位收集的思想,即将一个...

  • python实现基数排序(Radix Sort)

    python实现【基数排序】(Radix Sort) 算法原理及介绍 基数排序核心思想是按照低位先排序,然后收集;...

  • 算法面经--基数排序

    基数排序 一、算法思路 1.简单介绍 1)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法 基数排...

网友评论

      本文标题:【排序算法】7.基数排序

      本文链接:https://www.haomeiwen.com/subject/iwkiurtx.html