桶排序思想下的算法——基数排序

基数排序的使用条件要保证数据是十进制的数(否则需要自己改写基数排序)

图解过程如下:

代码挺不好理解的,实在理解不了用队列来写(我觉得我用不了多久就忘了)

public static void radixSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        radixSort(arr, 0, arr.length - 1, maxBits(arr));
    }

    //计算数组中最多有几个十进制位
    //找最大值,循环/10记录一次。
    private static int maxBits(int[] arr) {
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < arr.length; i++) {
            max = Math.max(max, arr[i]);
        }
        int res = 0;
        while (max != 0) {
            res++;
            max /= 10;
        }
        return res;
    }

    public static void radixSort(int[] arr, int left, int right, int digit) {
        final int radix = 10;       //保证是十进制数
        int i = 0;
        int j = 0;
        int[] bucket = new int[right - left + 1];
        for (int d = 1; d <= digit; d++) {   //先从d位开始,依次d+1位,d+2位.....
            //10个空间[0...9]
            //count[0]当前位(d位)上是0的数字有几个
            //count[1]当前位(d位)上是(0,1)的数字有几个
            //count[2]当前位(d位)上是(0,1,2)的数字有几个
            //count[i]当前位(d位)上是(0~i)的数字有几个
            int[] count = new int[radix];
            for (i = left; i <= right; i++) {
                j = getDigit(arr[i], d);     //取arr[i]上第d位的数
                count[j]++;
            }
            for (i = 1; i < radix; i++) {
                count[i] = count[i] + count[i - 1];
            }
            for (i = right; i >= left; i--) {
                j = getDigit(arr[i], d);
                bucket[count[j] - 1] = arr[i];
                count[j]--;
            }
            //拷贝回原数组
            for (i = left, j = 0; i <= right; i++, j++){
                arr[i] = bucket[j];
            }
        }
    }
    //分别取d位,d+1位,d+2位....上的数字
    public static int getDigit(int x, int d) {
        return ((x / ((int) Math.pow(10, d - 1))) % 10);
    }

随便拿几个数测试了一下:

posted @ 2020-07-16 15:04  硬盘红了  阅读(153)  评论(0编辑  收藏  举报