桶排序的基本思想:它就是把数组arr[]划分为N个大小相同的子区间(桶),每个子区间各自排序,最后合并。计数排序是桶排序的一种特殊情况,可以把计数排序当成每个桶里只有一个元素的情况。
步骤:
1.找出待排序数组中的最大值max、最小值min;
2.我们使用动态数组arraylist作为桶,桶里放的元素也用arraylist存储。桶的数量为(max-min)/arr.length+1;
3.遍历数组arr,计算每个元素arr[i]放的桶;
4.每个桶各自排序
算法实现:
1 public static void bucketSort(int[] arr){
2 int max = Integer.MIN_VALUE;
3 int min = Integer.MAX_VALUE;
4 for(int i = 0; i < arr.length; i++){
5 max = Math.max(max, arr[i]);
6 min = Math.min(min, arr[i]);
7 }
8 //创建桶
9 int bucketNum = (max - min) / arr.length + 1;
10 ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum);
11 for(int i = 0; i < bucketNum; i++){
12 bucketArr.add(new ArrayList<Integer>());
13 }
14 //将每个元素放入桶
15 for(int i = 0; i < arr.length; i++){
16 int num = (arr[i] - min) / (arr.length);
17 bucketArr.get(num).add(arr[i]);
18 }
19 //对每个桶进行排序
20 for(int i = 0; i < bucketArr.size(); i++){
21 Collections.sort(bucketArr.get(i));
22 }
23 }