美文网首页
基数排序

基数排序

作者: cg1991 | 来源:发表于2020-08-13 10:13 被阅读0次

个人主页:https://chengang.plus/

文章将会同步到个人微信公众号:Android部落格

1.1 描述

  • 取得数组中的最大数,并取得位数;
  • arr为原始数组,从最低位开始取每个位组成radix数组;
  • 对radix进行计数排序(利用计数排序适用于小范围数的特点);

基数排序的主要思路是,将所有待比较数值(注意,必须是正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次稳定排序(我们常用上一篇blog介绍的计数排序算法, 因为每个位可能的取值范围是固定的从0到9).这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列.

1.2 代码

public static int getBite(int value,int mod){
    return (value / mod) % 10;
}

public static void radixSort(){
    int max = numbers[0];
    for(int index = 0;index < size;index++){
        if(numbers[index] > max){
            max = numbers[index];
        }
    }
    int bucketSize = 10;
    List<List<Integer>> radixList = new ArrayList<List<Integer>>();
    for(int x = 0; x < bucketSize;x++){
        radixList.add(new ArrayList<Integer>());
    }
    int maxBite = String.valueOf(max).length();
    int curMod = 1;
    for(int i = 0;i < maxBite;i++){
        for(int j = 0; j < size;j++){
            int valueIndex = getBite(numbers[j],curMod);
            List<Integer> tempList = radixList.get(valueIndex);
            tempList.add(numbers[j]);
        }
        int originIndex = 0;
        System.out.println("--------------------");
        for(int y = 0; y < bucketSize;y++){
            List<Integer> itemRadixList = radixList.get(y);
            int itemSize = itemRadixList.size();
            if(itemSize == 0){
                continue;
            }
            System.out.println("itemSize:" + itemSize);
            for(int z = 0; z < itemSize;z++){
                numbers[originIndex++] = itemRadixList.get(z);
            }
            if(i != maxBite - 1){
                itemRadixList.clear();
            }
        }
        curMod *= 10;
    }
}

public static void main(String []args) {
    radixSort();
    for(int value : numbers){
        System.out.println("count value is:" + value);
    }
}

1.3 总结

  • 先选出最大值;
  • 按照最大值的位数逐个遍历数组中的元素,从低位到高位取位数上的数字,按照位数的数字放到对应的数组序号中;
  • 重复上一步一直到最高位,待遍历完成,基本上有序,对每个数组内的元素再做一次排序就整体有序了。

示意图如下:


image

相关文章

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

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

  • 数组-基数排序

    采用基数排序方式对数组进行排序 基数排序百科:基数排序排序(Distribution Sort),属于分配式排序,...

  • day12-基数排序

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

  • swift经典算法-基数排序

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

  • php-计数排序、基数排序、桶排序

    计数排序、基数排序、桶排序 时间复杂度 O(n) 计数排序 基数排序 桶排序

  • 数据结构之基数排序

    1.基数排序(桶排序)介绍 基数排序(radix sort)属于“分配式排序”(distribution sort...

  • 基数排序(Radix Sort)

    基本思想: 基数排序是一种有意思的排序,在看过其它比较排序后,基数排序真的很有意思。 基数排序(Radix Sor...

  • 5分钟了解基数排序

    5分钟了解基数排序 前言 基数排序无需进行比较和交换,而是利用分配和收集两种基本操作实现排序。基数排序分为两种:第...

  • 算法面经--基数排序

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

  • 基数排序

    基数排序已经不再是一种常规排序方法,它更多地像一种排序方法的应用,基数排序必须依赖于另外的排序方法。基数排序的总体...

网友评论

      本文标题:基数排序

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