正负数都可排序的基数排序

基数排序,正负数均可

有负数时,只需要

  • 把桶扩大为20
  • digit += 10 区分正负数,负数从小到大在 0-9 号桶,正数从小到大在 10 - 19 号桶
    注释很详细,直接挨着看注释
private int[] radixSort(int[] arr) {
        // 基数,在循环过程中根据数的大小自动增长
        int digitNumber = 1;
        // 桶,正数和负数共20个桶
        int[][] bucket = new int[20][arr.length > 19 ? arr.length : 20];
        // i 代表当前循环的基数,如 1,10,100....
        for (int i = 1, arrOrder = 0; i <= digitNumber;arrOrder = 0) {
            // 表示本次循环中基数是否已经扩大
            boolean digitExpand = false;
            // 本次循环中 20 个桶每个桶中存的数的个数
            int[] numberAmount = new int[20];
            // 放入桶中
            for (int num : arr) {
                // digit表示 num 要放在 20 格桶中的哪一个
                int digit = (num / i) % 10;
                // 这里是加 10 ,即正数用后 10 个桶,负数用前 10 个桶
                digit += 10;
                // numberAmount[digit] 初始值为 0 ,可以直接使用
                bucket[digit][numberAmount[digit]++] = num;
                // 本次循环中遇到有以下条件时最外层循环条件需要扩大一次,即基数需要乘以10
                // 比如第一次循环时digitNumber = 1,当前 num = 2,则不需扩大
                // 若 num = 10 则需要扩大一次最外层循环
                if (num >= (digitNumber * 10) && !digitExpand) {
                    digitNumber *= 10;
                    digitExpand = true;
                }
            }
            // 从 20 个桶中取出数据,完成一次排序
            for (int j = 0; j < 20; j++) {
                for (int k = 0; k < numberAmount[j]; k++) {
                    arr[arrOrder++] = bucket[j][k];
                }
            }
            // 每循环一次 i 需要乘以 10
            i *= 10;
        }

        return arr;
    }

有任何错欢迎评论告知


作者:myth_u
来源:CSDN
原文:https://blog.csdn.net/qq_41422347/article/details/95619253
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值