zoukankan      html  css  js  c++  java
  • 排序-->桶排序

    第一轮:

    第二轮:

     往下省略...

        //桶排序
        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;
        }
  • 相关阅读:
    1061 Dating (20 分)
    1112 Stucked Keyboard (20 分)
    1077 Kuchiguse (20 分)
    1065 A+B and C (64bit) (20 分)
    1046 Shortest Distance (20 分)
    1124 Raffle for Weibo Followers (20 分)
    1036 Boys vs Girls (25 分)
    1113 Integer Set Partition (25 分)
    f开头的
    g开头的
  • 原文地址:https://www.cnblogs.com/cai170221/p/13541733.html
Copyright © 2011-2022 走看看