算法 - 排序 - 基数排序

11 篇文章 0 订阅

1.  原理

基数排序又称为“桶子法”,从低位开始将待排序的数按照这一位的值放到相应的编号为0~9的桶中。等到低位排完得到一个子序列,再将这个序列按照次低位的大小进入相应的桶中,一直排到最高位为止,数组排序完成。

LSD——从低位向高位排

MSD——从高位向低位排

时间复杂度:O(N*digit)

空间复杂度:O(N)

稳定性:稳定

2. 算法执行步骤

(1)遍历序列找出最大的数(为的是确定最大的数是几位数);

(2)开辟一个与数组大小相同的临时数组tmp;

(3)用一个count数组统计原数组中某一位(从低位向高位统计)相同的数据出现的次数;

(4)用一个start数组计算原数组中某一位(从最低位向最高位计算)相同数据出现的位置;

(5)将桶中数据从小到大用tmp数组收集起来;

(6)重复(3)(4)(5)直到所有位都被统计并计算过,用tmp收集起来;

(7)将tmp数组拷回到原数组中

3 . 图示

4. 代码


    public static void main(String[] args) {
        int[] arrs = RandomArr.createIntArr(40, 0, 10000);
        int[] arrs2 = Arrays.copyOf(arrs, arrs.length);
        Arrays.stream(arrs).forEach(l -> {
            System.out.print(l + " ");
        });
        System.out.println();

        // System.out.println((Math.floor(1345 / (Math.pow(10, 2 - 1))) % 10));
        RadixSort(arrs);

        Arrays.stream(arrs).forEach(l -> {
            System.out.print(l + " ");
        });
        System.out.println();
        Arrays.stream(arrs2).sorted().forEach(l -> {
            System.out.print(l + " ");
        });
    }

    public static void RadixSort(int[] arrs) {

        // 1、找到其最大值
        int largest = arrs[0];
        for (int i = 1; i < arrs.length; i++) {
            if (arrs[i] > largest) {
                largest = arrs[i];
            }
        }
        int len = String.valueOf(largest).length();
        // 2、用10个桶来装数据
        List[] listArr = new List[10];
        // 3、逐位比较
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < arrs.length; j++) {
                int index = (int) (Math.floor(arrs[j] / (Math.pow(10, i))) % 10);
                if (listArr[index] == null) {
                    List list = new ArrayList<>();
                    list.add(arrs[j]);
                    listArr[index] = list;
                } else {
                    listArr[index].add(arrs[j]);
                }
            }
            // 4、对桶内元素进行排序
            for (int j = 0, index = 0; j < listArr.length; j++) {
                if (listArr[j] != null && listArr[j].size() > 0) {
                    Collections.sort(listArr[j]);
                    // 5、把排序好的数据重新还原到原数组
                    for (; listArr[j].size() > 0; ) {
                        arrs[index] = (int) listArr[j].get(0);
                        listArr[j].remove(0);
                        index++;
                    }
                }
            }
        }
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值