桶排序的基本思想:它就是把数组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 }