線性時間的排序 - Decision Tree Model & Counting Sort & Radix Sort & Bucket Sort
我們之前接觸過的 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.
有問題歡迎指出!
相關文章
- 桶排序bucket sort排序
- 計數排序 - Counting Sort排序
- Algorithm in Javascript Bucket SortGoJavaScript
- 排序sort排序
- Sort排序排序
- golang sort.Sort () 排序演算法學習Golang排序演算法
- Collections sort()排序方法排序
- 堆排序 Heap Sort排序
- Elasticsearch script sort 排序Elasticsearch排序
- 快速排序(Quick Sort)排序UI
- 希爾排序(Shell Sort)排序
- 快速排序 (Quick Sort)排序UI
- [Shell] Sort排序的例子排序
- _sort_elimination_cost_radit和sort排序排序
- 氣泡排序 bubble sort排序
- Lucene 排序 Sort與SortField排序
- 增大sort_area_size 後 排序時間增長排序
- 《shell下sort排序命令的使用》排序
- Array.sort排序問題排序
- Collections.sort()方法,字元排序字元排序
- 插入排序(Insertion Sort)排序
- go sort.Interface 排序介面Go排序
- R排序sort、order、rank、arrange排序
- 拓撲排序 - Topological Sort排序
- [CareerCup] 3.6 Sort Stack 棧排序排序
- 關於排序、sort_area_size、臨時表空間(轉)排序
- 排序合併連線(sort merge join)的原理排序
- 拓撲排序 POJ2367Genealogical tree[topo-sort]排序
- SORT (UNIQUE STOPKEY)/ SORT GROUP BY STOPKEYTopK
- 排序sort area 記憶體不足會用到臨時表空間排序記憶體
- 排序(對於 sort 函式的使用)排序函式
- 關於stable_sort()和sort()的區別:
- 【Oracle】排序與sort_area_sizeOracle排序
- 【c++】結構體sort排序C++結構體排序
- 75. Sort Colors:計數排序排序
- sort按照數值大小排序排序
- C# 字典排序Array.SortC#排序
- nls_sort與漢字排序排序