定义:
-
时间复杂度:O(n)
-
空间复杂度:
-
稳定否:
-
思想:适合年龄这种数据的排序,数据比较集中,桶好划分
改进版本:使得桶个数和桶内元素个数达到一个平衡
-
支持负数
-
值任意
-
支持自定义桶内元素的个数range参数
/**
* 桶排序
*
* @param array 排序数组
* @return 排序结果
*/
public static int[] bucketSort(int[] array) {
// 1、分桶
ArrayList<ArrayList<Integer>> buckets = new ArrayList<>(10);
for (int i = 0; i < 10; i++) {
buckets.add(new ArrayList<>());
}
// 2、将原数组中的元素放入到各个桶中
for (int arr : array) {
buckets.get(arr / 10).add(arr);
}
// 3、对每个桶进行排序;同时依次拿出排序后的桶的元素
int k = 0;
for (ArrayList<Integer> list : buckets) {
int[] ints = Sorted.insertSort(list.stream().mapToInt(Integer::intValue).toArray());
for (int a : ints) {
array[k++] = a;
}
}
return array;
}
/**
* 桶排序(改进版本)
*
* @param array 排序数组
* @return 排序结果
*/
public static int[] bucketSort(int[] array, int range) {
// 1、找到原数组中的最大值、最小值
int max = array[0];
int min = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
if (array[i] < min) {
min = array[i];
}
}
// 1、分桶
int nums = (max - min) / range + 1;
ArrayList<ArrayList<Integer>> buckets = new ArrayList<>(nums); // 桶个数的改进
for (int i = 0; i < nums; i++) {
buckets.add(new ArrayList<>());
}
// 2、将原数组中的元素放入到各个桶中
for (int arr : array) {
buckets.get((arr - min) / range).add(arr);
}
// 3、对每个桶进行排序;同时依次拿出排序后的桶的元素
int k = 0;
for (ArrayList<Integer> list : buckets) {
int[] ints = Sorted.insertSort(list.stream().mapToInt(Integer::intValue).toArray());
for (int a : ints) {
array[k++] = a;
}
}
return array;
}