/**
* @Version :
* @Description : 桶排序, 计数排序升级版, 同时排序多个子数组
*/
public class BucketSort {
public static void main(String[] args) {
int arr[]={3,2,2,5,4,0,5,4,5,1};
int[] copy = Arrays.copyOf(arr, arr.length);
copy = bucketSort(copy, 5);
for (int i : copy) {
System.out.print(i + " ");
}

}

public static int[] bucketSort(int[] arr, int bucketSize) {
int max = arr[0];
int min = arr[0];
for (int value : arr){
if (value > max) {
max = value;
}
if (value < min) {
min = value;
}
}

int bucketCount = (max - min) / bucketSize + 1;
// 一共bucketCount 个桶,但是每个桶中装的数不一样, 因此每个桶的容量是不一样的
int[][] bucket = new int[bucketCount][0];
// 数据分组放入桶中
for (int i = 0; i < arr.length; i++) {
int index = (arr[i] - min) / bucketSize;
// 向桶增加元素
bucket[index] = appendA(bucket[index], arr[i]);
}

int sortIndex = 0;
// 桶排序
for (int i = 0; i < bucketCount; i++) {
if (bucket[i].length <= 0) {
continue;
}
bucket[i] = InsertSort.insertionSort2(bucket[i]);
for (int value : bucket[i]) {
arr[sortIndex++] = value;
}
}
return arr;
}
// 更新桶元素
public static int[] appendA(int[] arr, int value) {
// 复制数组可以增加数组的长度
arr = Arrays.copyOf(arr, arr.length + 1);
arr[arr.length - 1] = value;
return arr;
}
}