概念
桶排序:取 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]