計數排序vs基數排序vs桶排序

從計數排序提及

計數排序是一種非基於元素比較的排序算法,而是將待排序數組元素轉化爲計數數組的索引值,從而間接使待排序數組具備順序性。mysql

計數排序的實現通常有兩種形式:基於輔助數組和基於桶排序。算法

基於輔助數組

整個過程包含三個數組:待排序數組A、計數數組B和輸出數組C。sql

簡單來講,就是經過統計待排序數組A中元素不一樣值的分佈直方圖,生成計數數組B,而後計算計數數組B的前綴和(此步操做能夠當作計算待排序數組A中每一個元素的位置信息),最後經過逆序循環將元素對應賦值到輸出數組C中,輸出數組C便是最終排序結果。數組

image

image

基於桶排序

其實就是用桶排序來維護穩定性,由於在每一個桶中的元素是以隊列結構排序的,能夠維護元素的順序。網絡

主要步驟:數據結構

  1. 按元素的最大健值與最小健值之差來建立指定數量的桶,並在每一個桶中建立一個隊列。
  2. 按順序遍歷待排序數組,將它們放到對應桶的隊列中。
  3. 按桶編號順序進行遍歷,將每一個桶中隊列按順序輸出回原數組中。

image

image

image

計數排序的不足

能夠看到輔助數組的長度和桶的數量由最大值和最小值決定,假如二者之差很大,而待排序數組又很小,那麼就會致使輔助數組或桶大量浪費。併發

基數排序

基數排序改善了計數排序,簡單來講,基數排序算法就是將整數或字符串切分紅不一樣的數字或字符,而後按對應位置的數或字符分別進行比較,這樣就能將輔助數組或桶的數量下降到一個較小的值,通過多輪排序後獲得最終的排序結果。機器學習

好比下面對於十進制的數值比較,只須要10個桶便可,但要保證每一個桶能放得進全部元素。學習

image

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

image

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

image

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

image

最終按照桶順序輸出獲得排序結果。

image

桶排序

桶排序是改善計數排序的方法之一,其基本思想是將待排序數組分配到若干個桶內,而後每一個桶內再各自進行排序,桶內的排序可使用不一樣的算法,好比插入排序或快速排序,屬於分治法。每一個桶執行完排序後,最後依次將每一個桶內的有序序列拿出來,即獲得完整的排序結果。

待排序數組的最大元素與最小元素分別爲19和1,那麼總的範圍區間可定義爲[0,19],假設用4個桶,則桶的區間分別爲[0,4][5,9][10,14][15,19]。能夠看到桶的數量能夠控制在很小的範圍內,並且桶的容量大小能夠動態擴充。

image

按照值將元素放到對應桶內。

image

按照桶順序將元素依次輸出獲得排序結果。

image

總結

  • 基數排序和桶排序能夠當作是計數排序的泛化版本,使用了某些措施優化排序過程。
  • 在桶排序中當桶的個數取最大值(max-min+1)的時候,就變成了計數排序,因此計數排序時桶排序的一種特例。
  • 基數排序能夠看作是多輪桶排序,基數排序以有效位的角度,每一個有效位都進行一輪桶排序。
  • 當用最大值做爲基數時,基數排序就退化成了計數排序。

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

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

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

2018彙總數據結構算法篇

2018彙總機器學習篇

2018彙總Java深度篇

2018彙總天然語言處理篇

2018彙總深度學習篇

2018彙總JDK源碼篇

2018彙總Java併發核心篇

2018彙總讀書篇


跟我交流,向我提問:

歡迎關注:

相關文章
相關標籤/搜索