桶排序(Bucket Sort)是计数排序的升级版。它利用了函数的映射关系,将待排序的数据分散到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。
桶排序是分布式排序算法,将数据分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或以递归方式继续使用桶排序进行排序)。
桶排序的引伸义可以理解为“分而治之”的策略,即将大问题分解为多个小问题,对每个小问题分别解决,然后再将结果合并。在桶排序中,大问题(排序整个数组)被分解为多个小问题(对每个桶内的元素进行排序)。
优点:
缺点:
桶排序适用于待排序数据分布在一个较小范围内的场景,特别是当数据是均匀分布时,效率会非常高。
假设有数组[4, 2, 2, 8, 3, 3, 1],我们要将其从小到大排序。
[1, 2, 2, 3, 3, 4, 8]。import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class BucketSort {
public static void bucketSort(int[] arr, int bucketSize) {
if (arr == null || arr.length == 0) {
return;
}
int minValue = arr[0];
int maxValue = arr[0];
for (int value : arr) {
if (value < minValue) {
minValue = value;
} else if (value > maxValue) {
maxValue = value;
}
}
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 value : arr) {
buckets.get((value - minValue) / bucketSize).add(value);
}
int k = 0;
// 对每个非空桶进行排序,并放回原数组
for (List<Integer> bucket : buckets) {
if (!bucket.isEmpty()) {
Collections.sort(bucket);
for (int val : bucket) {
arr[k++] = val;
}
}
}
}
public static void main(String[] args) {
int[] arr = {4, 2, 2, 8, 3, 3, 1};
int bucketSize = 3; // 桶的大小可以根据需要调整
bucketSort(arr, bucketSize);
// 输出排序后的数组
for (int value : arr) {
System.out.print(value + " ");
}
}
}在这个示例中,bucketSort方法首先找到数组中的最小值和最大值,然后根据桶的大小确定桶的数量。接下来,它创建了一个桶列表,并将数组中的每个元素放入相应的桶中。最后,它遍历桶列表,对每个非空桶进行排序,并将排序后的元素放回原数组。在main方法中,我们创建了一个示例数组,并调用了bucketSort方法来排序它,然后输出了排序后的结果。