線性時間的排序 - 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.
有問題歡迎指出!
相關文章
- 計數排序 - Counting Sort排序
- sort排序排序
- golang sort.Sort () 排序演算法學習Golang排序演算法
- 快速排序 (Quick Sort)排序UI
- Collections sort()排序方法排序
- 堆排序 Heap Sort排序
- Elasticsearch script sort 排序Elasticsearch排序
- Insertion Sort and Merge Sort
- 希爾排序(Shell Sort)排序
- 插入排序(Insertion Sort)排序
- SS241115C. 排序(sort)排序
- Collections.sort()方法,字元排序字元排序
- Array.sort排序問題排序
- go sort.Interface 排序介面Go排序
- Python中用來排序的方法sort、sortedPython排序
- 排序(對於 sort 函式的使用)排序函式
- 關於stable_sort()和sort()的區別:
- 【c++】結構體sort排序C++結構體排序
- Python 排序---sort與sorted學習Python排序
- 【Oracle】排序與sort_area_sizeOracle排序
- topo sort
- Queue Sort
- JavaScript sort()JavaScript
- Sorting 排序演算法: Quick Sort 快速排序排序演算法UI
- java中Collections.sort排序詳解Java排序
- 在命令列用 sort 進行排序命令列排序
- Algorithm-sort 排序演算法 pythonGo排序演算法Python
- Arrays.sort(arr)是什麼排序排序
- C++ partial_sort(部分排序)C++排序
- 快速排序演算法(Quick_Sort)排序演算法UI
- 簡單選擇排序(Simple Selection Sort)排序
- List排序Collections.sort 重寫compare排序
- 【轉】堆排序Heap Sort——Java實現排序Java
- sort()函式函式
- Leetcode Sort ColorsLeetCode
- Leetcode Sort ArrayLeetCode
- REPLACEMENT SELECTION SORT
- Sort Array By Parity
- Polyphase Merge Sort