📅  最后修改于: 2023-12-03 15:26:42.882000             🧑  作者: Mango
桶排序(Bucket Sort)属于线性排序,是将要排序的数据分到有限数量的桶子里,每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的数据有序地合并起来。
桶排序的时间复杂度为O(n+k),其中n为排序元素个数,k是桶的个数。
下面我们来看一下Java中的实现。
public class BucketSort {
public static void bucketSort(int[] array, int bucketSize) {
if (array.length < 2) {
return;
}
int minValue = array[0];
int maxValue = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] < minValue) {
minValue = array[i];
} else if (array[i] > maxValue) {
maxValue = array[i];
}
}
int bucketCount = (maxValue - minValue) / bucketSize + 1;
List<List<Integer>> buckets = new ArrayList<>(bucketCount);
for (int i = 0; i < bucketCount; i++) {
buckets.add(new ArrayList<>());
}
for (int i = 0; i < array.length; i++) {
buckets.get((array[i] - minValue) / bucketSize).add(array[i]);
}
int currentIndex = 0;
for (int i = 0; i < bucketCount; i++) {
List<Integer> bucket = buckets.get(i);
Collections.sort(bucket);
for (int j = 0; j < bucket.size(); j++) {
array[currentIndex++] = bucket.get(j);
}
}
}
}
代码解析:
minValue
和 maxValue
分别表示数组中最小值和最大值;bucketSize
表示桶的大小;bucketCount
表示桶的个数;buckets
是一个List,表示桶的集合;(array[i] - minValue) / bucketSize
计算数组元素所在的桶的下标,然后将数据放到对应的桶中;桶排序的思想简单,实现也比较容易,但需要根据具体的数据情况来选择合适的桶大小和桶个数。