基於桶的基數排序

前言

推出一個新系列,《看圖輕鬆理解數據結構和算法》,主要使用圖片來描述常見的數據結構和算法,輕鬆閱讀並理解掌握。本系列包括各類堆、各類隊列、各類列表、各類樹、各類圖、各類排序等等幾十篇的樣子。mysql

基數排序

基數排序(Radix Sort)算法是一種非比較的排序算法,早在 1887 年 Herman Hollerith 就已經在打孔卡片製表機中使用該算法。通常多用於對整數的排序,但因爲整數與某些字符能互相轉換,因此它也可以用於字符串的排序。簡單來講,基數排序算法就是將整數或字符串切分紅不一樣的數字或字符,而後按對應位置的數或字符分別進行比較。算法

穩定性

基數排序具有穩定性,即能保證相同值元素之間的相對順序在排序先後一致。基於計數排序的方式主要是經過對計數數組進行前綴和運算,外加經過額外的輔助數組,最後逆序循環將待排序數組中的全部元素放置到輔助數組中,以達到穩定性效果。而基於桶的方式則是經過在每一個桶中控制順序,從而達到穩定性效果。sql

時間複雜度

基數排序的時間複雜度爲Ο(w(n+k)),其中n爲待排序數組長度;k爲關鍵字的取值範圍,等於進制數,好比十進制則k=10;w爲待排序數組元素最大的字長,好比最大字長元素爲358,則字長爲3。數組

當k肯定後,時間複雜度其實就是O(wn),但有時還須要考慮字長w,不能簡單將其認定爲常數。假如取基數爲B(即B進制),待排序集合最大元素爲N,則w爲大於log_B N的最小整數。因此並非說基數排序就必定完勝最好的比較排序(O(n * log n)),實際過程當中還跟所取的基和待排序集合具體的狀況相關。網絡

排序方式

基數排序能夠採用最高有效數位(MSD)和最低有效數位(LSD)兩種方式,其中LSD的排序方式由鍵值的最右邊開始,而MSD則相反,由鍵值的最左邊開始。數據結構

在算法過程當中,對於LSD,對某個有效數位分配後須要執行一次合併,而後再對下一位分配;而對於MSD,對某個有效數位分配後不執行合併,它將繼續對相同高位的元素繼續進行分配,直到沒法繼續分配時執行合併操做。併發

基於桶實現

基於桶方式是指使用桶做爲輔助工具,過程當中循環每一個有效數位將元素分配到對應的桶中,從而實現基數排序。機器學習

基於桶方式的基數排序的操做步驟以下:數據結構和算法

  1. 肯定桶的數量,由進制數肯定,好比十進制則桶的數量爲10,分別表明0到9,而且每一個桶內的結構爲隊列。
  2. 從最低有效位到最高有效位,針對每一個有效位執行步驟3到步驟5。
  3. 按順序遍歷待排序數組,根據當前有效位將它們分配到對應桶的隊列中。
  4. 按桶編號順序進行遍歷,將每一個桶中隊列按順序收集到原數組中。
  5. 選擇下一個有效位執行步驟2到步驟4,直到全部有效位處理完獲得的結果便是最終的結果。

一樣是對前面的8位小學生的語數英總成績進行基於桶方式的基數排序操做。一共有8個學生,因此待排序數組長度爲8。並且由於使用十進制,因此桶的索引範圍是0-9。此外每一個桶對應建立一個隊列,這裏假設隊列長度爲5,長度也能夠爲待排序數組長度,但實際中更多使用動態擴展策略。工具

image

第一階段:針對個位數將元素放到對應的桶中。

待排序數組的第一個元素的健值爲198,放到編號8的桶中。

image

第二個元素的健值爲248,放到編號爲8的桶中。

image

第三個元素的健值爲98,放到編號爲8的桶中。

image

第四個元素的健值爲247,放到編號爲7的桶中。

image

相似地,將剩下的元素都放到對應桶中的隊列,能夠看到每一個桶中的隊列維護了順序性。

image

接着按桶順序將桶中隊列輸出到原數組中,先輸出編號爲0的桶。

image

接着輸出編號爲7的桶。

image

再輸出編號爲8的桶。

image

最後輸出編號爲9的桶。

image

第二階段:針對十位數將元素放到對應的桶中。

待排序數組的第一個元素的健值爲80,放到編號8的桶中。

image

第一個元素的健值爲247,放到編號4的桶中。

image

將剩下的元素都放到對應桶中的隊列。

image

將編號爲4的桶的隊列輸出到原數組中。

image

將編號爲8的桶的隊列輸出到原數組中。

image

將編號爲9的桶的隊列輸出到原數組中。

image

第三階段:針對百位數將元素放到對應的桶中。

第一個元素的健值爲247,放到編號2的桶中。

image

第二個元素的健值爲247,放到編號2的桶中。

image

將剩下的元素都放到對應桶中的隊列。

image

將編號爲0的桶的隊列輸出到原數組中。

image

將編號爲1的桶的隊列輸出到原數組中。

image

將編號爲2的桶的隊列輸出到原數組中。

image

至此,以上完成整個排序過程。

-------------推薦閱讀------------

個人開源項目彙總(機器&深度學習、NLP、網絡IO、AIML、mysql協議、chatbot)

爲何寫《Tomcat內核設計剖析》

2018彙總數據結構算法篇

2018彙總機器學習篇

2018彙總Java深度篇

2018彙總天然語言處理篇

2018彙總深度學習篇

2018彙總JDK源碼篇

2018彙總Java併發核心篇

2018彙總讀書篇


跟我交流,向我提問:

歡迎關注:

相關文章
相關標籤/搜索