【圖解資料結構】 一組動畫徹底理解桶排序
由於LeetCode上的演算法題很多涉及到一些基礎的資料結構,為了更好的理解後續更新的一些複雜題目的動畫,推出一個新系列 -----《圖解資料結構》,主要使用動畫來描述常見的資料結構和演算法。本系列包括十大排序、堆、佇列、樹、並查集、圖等等大概幾十篇。
桶排序
桶排序(Bucket sort)是一種基於計數的排序演算法( 計數排序 可參考上節的內容),工作的原理是將資料分到有限數量的桶子裡,然後每個桶再分別排序(有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序)
演算法步驟
-
設定固定數量的空桶。
-
把資料放到對應的桶中。
-
對每個不為空的桶中資料進行排序。
-
拼接不為空的桶中資料,得到結果。
演算法演示
動畫演示GIF載入有點慢,請稍等片刻 _

image
排序動畫過程解釋
-
首先,設定固定數量的空桶,在這裡為了方便演示,設定桶的數量為 5 個空桶
-
遍歷整個數列,找到最大值為 56 ,最小值為 2 ,每個桶的範圍為 ( 56 - 2 + 1 )/ 5 = 11
-
再次遍歷整個數列,按照公式 floor((數字 – 最小值) / 11) 將數字放到對應的桶中
-
比如,數字 7 代入公式 floor((7 – 2) / 11) = 0 放入 0 號桶
-
數字 12 代入公式 floor((12 – 2) / 11) = 0 放入 0 號桶
-
數字 56 代入公式 floor((56 – 2) / 11) = 4 放入 4 號桶
-
當向同一個索引的桶,第二次插入資料時,判斷桶中已存在的數字與新插入數字的大小,按照左到右,從小到大的順序插入(可以使用前面講解的 插入排序 )實現
-
比如,插入數字 19 時, 1 號桶中已經有數字 23 ,在這裡使用插入排序,讓 19 排在 23 前面
-
遍歷完整個數列後,合併非空的桶,按從左到右的順序合併0,1,2,3,4桶。
-
這樣就完成了 桶排序
程式碼實現
為了更好的讓讀者用自己熟悉的程式語言來理解動畫,筆者將貼出多種程式語言的參考程式碼,程式碼全部來源於網上。
C++程式碼實現

image
Java程式碼實現

image
JavaScript程式碼實現

image