排序-->桶排序

第一轮:

第二轮:

 往下省略...

    //桶排序
    public static int[] bucketSort(int[] arr){
        //1.取最大  ,最小值
        int max=0,min=0;
        for (int i = 0; i < arr.length; i++) {
            if(i==0){
                max=arr[i];
                min=arr[i];
            }else{
                if(arr[i]>max)max=arr[i];
                if(arr[i]<min)min=arr[i];
            }
        }
        //小于0时可能会报错 ,先把数组转成正数
        if(min<0){
            for (int i = 0; i < arr.length; i++) {
                arr[i] -= min;
            }
        }
        int maxLength = (max+"").length();//获取是几位数,便于之后取/
        int[][] bucket = new int[10][arr.length];
        int[] bucketElementCounts = new int[10];
        //没轮取当前位置的值排序(各位,十,百)从低往高
        for (int n = 0, g=1; n < maxLength; n++,g*=10) {
            for (int i = 0; i < arr.length; i++) {
                int digitOfElement = arr[i]/g % 10;// 求各(个,十,百....)位数的数值
                bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[i];// [个位数值][该数存放的第几个]
                bucketElementCounts[digitOfElement]++; //桶中存放的量+1
            }
            // 存放完毕后再取回原数组
            int index = 0;
            //bucketElementCounts每轮置0  循环bucketElementCounts.length所以不用没轮把bucket置空
            for (int j = 0; j < bucketElementCounts.length; j++) {
                if (bucketElementCounts[j] != 0) {
                    // 表示存储的有数据
                    for (int k = 0; k < bucketElementCounts[j]; k++) {
                        arr[index] = bucket[j][k];
                        index++;
                    }
                }
                bucketElementCounts[j] = 0;//为下一轮初始化
            }
            System.out.println(Arrays.toString(arr));

        }
        //小于0时上面-的min  补回来
        if(min<0){
            for (int i = 0; i < arr.length; i++) {
                arr[i] += min;
            }
        }
        return arr;
    }
原文地址:https://www.cnblogs.com/cai170221/p/13541733.html