桶排序
排序思想
划分多个范围相同的区间,每个子区间自排序,最后合并。
核心代码
/**
* 桶排序
* @param arr 数组
* @param bucketLen 每个桶的长度
*/
private static void bucketSort(int[] arr, int bucketLen) {
//获取数组中的最大最小值
int min = arr[0];
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (min > arr[i]) {
min = arr[i];
}
if (max < arr[i]) {
max = arr[i];
}
}
//根据数据区间以及每个桶中数据的个数 获取需要桶的个数 边界问题 +1
int bucketCount = (max - min) / bucketLen + 1;
//对数据进行分桶
List<List<Integer>> lists = new ArrayList<List<Integer>>(bucketCount);
//初始化
for (int i = 0; i < bucketCount; i++) {
lists.add(new ArrayList<Integer>());
}
//将数据分配到桶中
for (int k : arr) {
lists.get((k - min) / bucketLen).add(k);
}
//对每个桶中的数据进行排序
for (int i = 0; i < bucketCount; i++) {
Collections.sort(lists.get(i));
}
//将桶中的数据复制到原数组
int index = 0;
for (int i = 0; i < bucketCount; i++) {
for (int j = 0; j < lists.get(i).size(); j++) {
arr[index++] = lists.get(i).get(j);
}
}
}
特点
平均时间复杂度O(n+k),最好时间复杂度O(n),最坏时间复杂度O(n2),空间复杂度O(n+k),稳定。k桶的个数。