概念
桶排序:取 n 个桶,根据数组的最大值和最小值确认每个桶存放的数的区间,将数组元素插入到相应的桶里,最后再合并各个桶
复杂度
最好:O(n),每个数都在分布在一个桶里,这样就不用将数插入排序到桶里了(类似于计数排序以空间换时间)。
最坏:O(n²),所有的数都分布在一个桶里。
平均:O(n + k),k表示桶的个数。
代码
// 桶算法
function bucket_sort(arr) {
let bucket = 10
let max = Math.max(...arr)
let min = Math.min(...arr)
// 计算每个桶存放的数值范围,至少为1
let range = Math.ceil((max - min) / bucket) || 1;
// 创建二维数组,第一维表示第几个桶,第二维表示该桶里存放的数
let bucket_arr = Array.from(Array(bucket)).map(() => Array().fill(0));
arr.forEach(val => {
// 计算元素应该分布在哪个桶
let index = parseInt((val - min) / range);
// 防止index越界,例如当[5,1,1,2,0,0]时index会出现5
index = index >= bucket ? bucket - 1 : index;
let temp = bucket_arr[index];
// 插入排序,将元素有序插入到桶中
let j = temp.length - 1;
while (j >= 0 && val < temp[j]) {
temp[j + 1] = temp[j];
j--;
}
temp[j + 1] = val;
});
// 修改回原数组
let res = [].concat.apply([], bucket_arr);
arr.forEach((val, i) => {
arr[i] = res[i];
})
}
var sortArr = [9, 6, 3, 5, 2, 1, 7, 343, 6, 643, 243, 544, 5, 63, 234, 0, 56, 123]
bucket_sort(sortArr)
console.log(sortArr)
// [0, 1, 2, 3, 5, 5, 6, 6, 7, 9, 56, 63, 123, 234, 243, 343, 544, 643]