八大排序算法——基数排序(八)

//基数排序
public class RadixSort {
    public void radixSort(int[] data, int left, int right) {
        if (left < 0 || right > data.length - 1 || left >= right) {
            return;
        }
        int maxDigit = getMaxDigit(data);
        int mod = 10;
        int dev = 1;
        for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
            // 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)
            //            列初始化为0,是为了节省空间,要插入数据时,再扩容。
            int[][] counter = new int[20][0];
            for (int j = left; j <= right; j++) {
                //                data[j]%mod:1234 % 100 = 34; 34 / 10 = 3
                //                (因为是整型数),这样就得到十位上的数了,
                //                +10是因为前面扩充了,[10-19]才对应正数。
                int bucket = ((data[j] % mod) / dev) + 10;
                counter[bucket] = arrayAppend(counter[bucket], data[j]);
            }
            //            把篮子里的数据拿出来放入数组内
            int index = left;
            for (int[] bucket : counter) {
                for (int value : bucket) {
                    //                    index++是先运行完data[index],再将index++;
                    //                    ++index是先将index加了,再运行data[index],此时相当于data[index+1];
                    data[index++] = value;
                }
            }
        }
    }

    //    获取最高位数,就是绝对值最大值有多少位。
    private int getMaxDigit(int[] data) {
        int maxAbsValue = getAbsMaxValue(data);
        return getNumLength(maxAbsValue);
    }

    //    获取绝对值最大值,循环一遍找出来
    private int getAbsMaxValue(int[] data) {
        int maxAbsValue = data[0];
        for (int value : data) {
            if (Math.abs(maxAbsValue) < Math.abs(value)) {
                maxAbsValue = value;
            }
        }
        return maxAbsValue;
    }

    //    获取数字的位数
    private int getNumLength(int value) {
        if (value == 0) {
            return 1;
        }
        int length = 0;
        //        利用整形数会舍掉小数的机制
        for (int i = value; i != 0; i /= 10) {
            length++;
        }
        return length;
    }

    //    给数组扩容
    private int[] arrayAppend(int[] data, int value) {
        data = Arrays.copyOf(data, data.length + 1);
        data[data.length - 1] = value;
        return data;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值