>[success] # 桶排序
[可視化桶排序算法](https://juejin.im/post/6844904195896639496)
~~~
1.桶排序和計數排序很像,如果把計數排序每個數組對應位置看成桶,那么每個數據都有
一個屬于自己的桶
2.桶排序:它利用函數的映射關系,將待排序元素分到有限的桶里,然后桶內元素再進行排序
(可能是別的排序算法),最后將各個桶內元素輸出得到一個有序數列
~~~
>[info] ## js 代碼實現
~~~
1.首先我們需要桶,并且需要將這些元素分配到對應桶中,我們可以用二維數組的格式抽象化這種數據
結構'[ [ 5, 1 ], [ 10, 6, 7 ], [ 15 ], [ 19 ] ]',然后我們再把每個桶中的數據排序,最后就是整個數組的排序
~~~
>[danger] ##### 代碼實現
~~~
1.在整個過程中最重要的就是計算桶的個數,可以利用公式'數組最大值和最小值的差值并與桶的大小進行除法計算'
1.1.這句話意味著我們還要求出最大值和最小值(等價替換法)
1.2.我們還要做一個桶的計算"((最大值-最小值)/默認分組桶的個數)+1"
1.3.當然我們還要把一維數組的值對應放進二維數組的桶中,這些值具體屬于哪個桶,就跟我們
在求出這些桶分組公式一樣不過最大值變成了這些項
注:上面描述的步驟我們都放在一個叫'createBuckets' 方法中
2.注意了桶排序每個桶中具體順序還是需要配合其他排序算法的
~~~
~~~
function bucketSort(array, bucketSize = 5) {
if (array.length < 2) {
return array;
}
const buckets = createBuckets(array, bucketSize);
return sortBuckets(buckets); // 其他排序算法對每個桶中的內容排序
}
function createBuckets(array,bucketSize){
// 求出最大值和最小值
let maxValue = array[0]
let minValue = array[0]
for(let i=0,item;item = array[i++];){
if(item>maxValue){
maxValue = item
}else if(item<minValue){
minValue = item
}
}
// 根據公式算出桶的個數
const bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;
// 將這些桶和數組進行規整成二維數組
const bukets = Array.from({length:bucketCount},(v,i)=>[])
// 將之前的數據放回到這些桶中
for(let i=0;item;item=array[i++]){
// 算出當前值應該屬于哪個桶
const bucketIndex = Math.floor((array[i] - minValue) / bucketSize); // {8}
buckets[bucketIndex].push(array[i]);
}
return buckets;
}
function sortBuckets(buckets) {
const sortedArray = [];
for (let i = 0; i < buckets.length; i++) {
if (buckets[i] != null) {
insertionSort(buckets[i]); // 這里采用了插入排序關于插入排序的寫法參考插入排序代碼
sortedArray.push(...buckets[i]);
}
}
return sortedArray;
}
~~~
- 接觸數據結構和算法
- 數據結構與算法 -- 大O復雜度表示法
- 數據結構與算法 -- 時間復雜度分析
- 最好、最壞、平均、均攤時間復雜度
- 基礎數據結構和算法
- 線性表和非線性表
- 結構 -- 數組
- JS -- 數組
- 結構 -- 棧
- JS -- 棧
- JS -- 棧有效圓括號
- JS -- 漢諾塔
- 結構 -- 隊列
- JS -- 隊列
- JS -- 雙端隊列
- JS -- 循環隊列
- 結構 -- 鏈表
- JS -- 鏈表
- JS -- 雙向鏈表
- JS -- 循環鏈表
- JS -- 有序鏈表
- 結構 -- JS 字典
- 結構 -- 散列表
- 結構 -- js 散列表
- 結構 -- js分離鏈表
- 結構 -- js開放尋址法
- 結構 -- 遞歸
- 結構 -- js遞歸經典問題
- 結構 -- 樹
- 結構 -- js 二搜索樹
- 結構 -- 紅黑樹
- 結構 -- 堆
- 結構 -- js 堆
- 結構 -- js 堆排序
- 結構 -- 排序
- js -- 冒泡排序
- js -- 選擇排序
- js -- 插入排序
- js -- 歸并排序
- js -- 快速排序
- js -- 計數排序
- js -- 桶排序
- js -- 基數排序
- 結構 -- 算法
- 搜索算法
- 二分搜索
- 內插搜索
- 隨機算法
- 簡單
- 第一題 兩數之和
- 第七題 反轉整數
- 第九題 回文數
- 第十三題 羅馬數字轉整數
- 常見一些需求
- 把原始 list 轉換成樹形結構