線性時間的排序 - Decision Tree Model & Counting Sort & Radix Sort & Bucket Sort

殷老實發表於2016-12-05

我們之前接觸過的 O(nlogn) 演算法如 merger sort, heap sort, quick sort 等都是通過挨個比較輸入序列的大小來決定順序的。

這些演算法的平均時間複雜度都是O(nlogn)的,今天要學習的都是線上性時間完成排序的演算法。


1. Decision Tree Model.

   決策樹模型是通過一系列的基於一些數量的比較直接產生結果的排序方法。- 注意:其中這些比較可以看作是 一個個的boolean function.


以下就是一個簡單的對有三個元素的陣列的排序的決策樹。 注意:1. 每個橢圓框中的數字代表的是陣列的索引 2. 葉子節點的長方形框代表的是最終結果的索引序列

                                                      3. 無論是橢圓框還是長方型框中的索引的數字 必須大於等於1 小於等於的長度 (或者<= 0  && <= length - 1)


例子. [6, 8 ,5]  索引1 和 索引2 比較 6 < 8 進入 左邊路徑,索引2 和 索引3 比較 8 > 5, 進入右路徑, 索引 1 和索引3 , 6 > 5 進入 右路徑來到 葉子節點 [3, 1, 2] 即 5, 6, 8為最終結果

 

2. Counting Sort

  計數排序的原理很簡單一句話,對於任意輸入元素x, 通過計算在輸入序列中的有多少個小於x的元素的數量,  將這個數量計作y, 那麼在輸出序列中 -  x 的位置就是 y. 對輸入的序列有一定的要求,要求輸入的序列的範圍很小。

GitHub 程式碼實現 - 有註釋 Github



3. Radix Sort

   基數排序, 是對每個元素的按照從個位到最高位依次進行排序。


A. 首先第一步, 對這一系列的數按照個位的大小進行排序,個位相同的數按照當前序列中的順序排列。比如457 和 657 個位都是 7, 但是當前數列中457在657前面,那麼在新的數列中我們還是將457放到657前面

B. 第二步, 對按照個位排好的結果的序列進行排序,規則是比較各個元素的十位上的數,十位上的數相同的按照第一步中的規則來

C. 第三部,按照百位的數進行排序。




4. Bucket Sort

   桶排序的原理也很簡單,對於輸入序列A,我們建立一個和它大小一樣的序列B,在序列B中每個節點儲存的是一系列範圍的數,這個範圍是由小到大並且是根據序列A中的數值而來的。例子如下

序列A中的數值如圖, 數列B中的每個塊儲存的是一定範圍中的數,比如 B[0] 中儲存的是 0 - 0.1, B[1] 中儲存的是 0.1 - 0.2.  其中B[0]中儲存的是一個list, 這個list中的數是按照由大到小排列的. 當我們將A序列按照規則放到B序列中的之後, 我們就可以通過挨個輸出B序列中的list. 得到final的result.



有問題歡迎指出!


相關文章