0
点赞
收藏
分享

微信扫一扫

java 基数排序

Resin_Wu 2022-05-01 阅读 72
package chaper05;

import java.util.Arrays;

public class ArrayTest6 {
    public static void main(String[] args) {
        int[] arr = {1232,889,7789,8,990,78,8,6,6443456,8,11};
        radixSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    //基数排序   不基于比较的排序  一种特殊的状态   十进制的数
    public static void radixSort(int[] arr){
        if (null == arr || arr.length < 2){
            return;
        }
        radixSort(arr,0,arr.length-1,maxBits(arr));
    }

    /**
     *
     * @param arr 数组
     * @return  返回数组中最大值的位数  数组的最大位数
     */
    public static int maxBits(int[] arr){
        int max=Integer.MIN_VALUE;
        for (int i = 0; i < arr.length-1 ;i++) {
            max = Math.max(max,arr[i]);
        }
        int result = 0;
        while (max != 0) {
            result++;
            max /= 10;
        }
        return result;
    }

    /**
     *
     * @param arr  数组
     * @param left 开始下标
     * @param right  结束下标
     * @param maxBits 数组位数
     */
    private static void radixSort(int[] arr, int left, int right, int maxBits) {
        final int radix = 10;  //桶子的个数
        int i = 0,j = 0;
        int[] help = new int[right - left + 1]; //辅助数组的长度等于原数组的长度
        for (int b = 1; b <= maxBits; b++) {  //出桶进桶的次数     b就是当前位    1代表个位 2十位 3百位.....
            int[] count = new int[radix];  //累计出个位相同的有多少位
            for (i=left;i <= right; i++){
                j = getDigit(arr[i],b);
                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],b);
                help[count[j]-1]= arr[i];//  count[j]-1  减一很关键
                count[j]--;
            }
            //到这表示入桶出桶一次
            for (i=left,j=0;i<=right;i++,j++){
                arr[i]=help[j];
            }
        }
    }

    /**
     *
     * @param i 数
     * @param b  位   1表示个位 2表示十位 .....
     * @return  返回一个数当前位对应的值
     */
    private static int getDigit(int i, int b) {
        return (i/((int)(Math.pow(10,b-1))) % 10);
    }
}
举报

相关推荐

0 条评论