本文共 1346 字,大约阅读时间需要 4 分钟。
划分多个范围相同的区间,每个子区间自排序,最后合并。
   /**     * 桶排序     * @param arr        数组     * @param bucketLen 每个桶的长度     */    private static void bucketSort(int[] arr, int bucketLen) {           //获取数组中的最大最小值        int min = arr[0];        int max = arr[0];        for (int i = 1; i < arr.length; i++) {               if (min > arr[i]) {                   min = arr[i];            }            if (max < arr[i]) {                   max = arr[i];            }        }        //根据数据区间以及每个桶中数据的个数  获取需要桶的个数  边界问题 +1        int bucketCount = (max - min) / bucketLen + 1;        //对数据进行分桶        List            > lists = new ArrayList                  >(bucketCount);        //初始化        for (int i = 0; i < bucketCount; i++) {               lists.add(new ArrayList               ());        }        //将数据分配到桶中        for (int k : arr) {               lists.get((k - min) / bucketLen).add(k);        }        //对每个桶中的数据进行排序        for (int i = 0; i < bucketCount; i++) {               Collections.sort(lists.get(i));        }        //将桶中的数据复制到原数组        int index = 0;        for (int i = 0; i < bucketCount; i++) {               for (int j = 0; j < lists.get(i).size(); j++) {                   arr[index++] = lists.get(i).get(j);            }        }    }                    
        
   平均时间复杂度O(n+k),最好时间复杂度O(n),最坏时间复杂度O(n2),空间复杂度O(n+k),稳定。k桶的个数。
转载地址:http://oobcz.baihongyu.com/