桶排序(Bucket Sort)是一种简单的排序算法。它将数组分到有限数量的桶子里,每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。
我们可以实现桶排序算法如下:
public void bucketSort(int[] nums) {
// 1. 设置桶的数量
int bucketNum = 5;
// 2. 找出数据的最大最小值,并计算每个桶存放的数据范围大小
int minVal = Integer.MAX_VALUE;
int maxVal = Integer.MIN_VALUE;
for (int num : nums) {
minVal = Math.min(minVal, num);
maxVal = Math.max(maxVal, num);
}
int bucketSize = (maxVal - minVal) / bucketNum + 1;
// 3. 初始化桶
List<List<Integer>> bucket = new ArrayList<>(bucketNum);
for (int i = 0; i < bucketNum; i++) {
bucket.add(new ArrayList<>());
}
// 4. 将每个数据放入桶中
for (int num : nums) {
int bucketIndex = (num - minVal) / bucketSize;
bucket.get(bucketIndex).add(num);
}
// 5. 对每个桶内部的数据进行排序
for (int i = 0; i < bucketNum; i++) {
Collections.sort(bucket.get(i));
}
// 6. 依次取出每个桶的数据
int index = 0;
for (int i = 0; i < bucketNum; i++) {
for (int num : bucket.get(i)) {
nums[index++] = num;
}
}
}
算法流程:
- 设置桶的数量,这里为5个桶。
- 找到数组的最大最小值,计算每个桶的大小。
- 初始化桶,创建一个List存储每个桶。
- 将每个数据放入对应桶中。
- 对每个桶内的数据进行排序。
- 依次取出每个桶的数据,放回原数组。
时间复杂度O(n),空间复杂度O(n)。
所以,桶排序的关键是:
- 设置适当的桶数量。
- 计算每个桶存放数据的范围大小。
- 将数据放入对应桶中。
- 对每个桶的数据进行排序。
- 依次取出桶中的数据。