/**
* 桶排序<br>
* 它将数组分割成一些桶子,每个桶子里的元素再进行排序。桶排序要求待排序的数据必须是有确定范围的整数
*
* @param arr
*/
public static void bucketSort(int[] nums) {
int maxVal = Integer.MIN_VALUE;
int minVal = Integer.MAX_VALUE;
// 确定待排序数组的最大值和最小值
for (int num : nums) {
maxVal = Math.max(maxVal, num);
minVal = Math.min(minVal, num);
}
// 计算需要的桶的数量
int bucketNum = (maxVal - minVal) / nums.length + 1;
ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum);
for (int i = 0; i < bucketNum; i++) {
bucketArr.add(new ArrayList<Integer>());
}
// 将数据放入桶中
for (int num : nums) {
int bucketIndex = (num - minVal) / nums.length;
bucketArr.get(bucketIndex).add(num);
}
// 对每个桶中的数据进行排序
for (ArrayList<Integer> arr : bucketArr) {
Collections.sort(arr);
}
// 将桶中的数据依次放回原数组
int index = 0;
for (ArrayList<Integer> arr : bucketArr) {
for (int num : arr) {
nums[index++] = num;
}
}
}
public static int getMax(int[] arr) {
int max = Integer.MIN_VALUE;
for (int val : arr) {
if (val > max) {
max = val;
}
}
return max;
}
public static void main(String[] args) {
int[] arr = new int[] { 4, 3, 2, 5, 12, 6, 8, -1, 55, 67, 54, 23 };
bucketSort(arr);
System.out.println(Arrays.toString(arr));
}