計數排序 -- GoLang實現
前提假設
假設 n 個輸入元素中每一個都是在 0 到 k 區間內的一個整數,其中 k 為某個整數。
基本思想
對每一個輸入元素 x,確定小於 x 的元素個數。然後利用這個值,可以直接把 x 放到它在輸出陣列中的位置。
例如
對陣列 [ 2, 5, 3, 0, 2, 4, 0, 3 ] 進行計數排序,其中小於 4 的元素有 6 個,那麼 4 應該放在第 7 個輸出位置上。
虛擬碼實現:
說明:假設輸入是一個陣列 A[ 1 … n ], A.length = n。還需要另外兩個陣列
B[ 1…n ]: 存放最終排序的輸出
C[ 1…k ]: 提供臨時儲存空間,用於統計陣列 A 中每個元素的個數和統計陣列 A 中每個元素 x 的排名(即小於 x 的元素個數)
COUNTER-SORT(A, B, k)
let C[0..k] be a new array
for i = 0 to k
C[i] = 0
for j = 1 to A.length
C[A[j]] = C[A[j]] + 1
// C[i] now contains the number of elements equal to i.
for i = 1 to k
C[i] = C[i] + C[i - 1]
// C[i] now contains the numer of elements less than or equal to i.
for j = A.length downto 1
B[C[A[j]]] = A[j]
C[A[j]] = C[A[j]] - 1
Golang原始碼實現:
// CounterSort 計數排序
func CounterSort(A, B []int, k int) {
LengthA := len(A)
C := make([]int, k+1)
for i := 0; i < LengthA; i++ {
C[A[i]]++
}
for j := 1; j < k+1; j++ {
C[j] += C[j-1]
}
for l := LengthA - 1; l >= 0; l-- {
B[C[A[l]]-1] = A[l]
C[A[l]]--
}
}
演算法分析:
時間複雜度:
第5 ~ 7行的for迴圈和11 ~ 14的for迴圈耗時為 O(n),第8 ~ 10 行的for 迴圈耗時為 O(k)。所以演算法的時間複雜度為 O( n + k)。
穩定性:計數排序是穩定排序,其穩定性依賴於最後一次遍歷的for迴圈是 從後往前遍歷陣列 A 的,並且每次填充了一個元素後,C[ A[ l ] ] 執行自減操作。意味著當出現相同元素時,該相同的元素會被放到另一個相同元素的前面,即保持了穩定性。
問題延伸:
請設計一個演算法,它能夠對於任何給定的介於 0 到 k 之間的 n 個整數先進行預處理,然後在 O(1) 的時間內回答輸入 n 個整數中有多少個落在區間 [ a … b ] 內。你設計的演算法的預處理時間應為 O( n + k )。
評論區留下你的想法吧。
相關文章
- Golang實現氣泡排序法Golang排序
- Golang的滑動視窗計數器Redis限速實現GolangRedis
- 計數排序、桶排序和基數排序排序
- 計數排序vs基數排序vs桶排序排序
- 計數排序排序
- 教你如何運用golang 實現陣列的隨機排序Golang陣列隨機排序
- 如何使用Python語言實現計數排序演算法?Python排序演算法
- Java排序之計數排序Java排序
- 計數排序的原址排序排序
- 資料結構和演算法(Golang實現)(25)排序演算法-快速排序資料結構演算法Golang排序
- Golang實現微型數學運算直譯器Golang
- Golang 併發程式設計(channel實現)Golang程式設計
- 常見的Golang設計模式實現?Golang設計模式
- 非交換排序-計數排序和桶排序排序
- 排序演算法__計數排序排序演算法
- 實現堆排序排序
- 基於桶的排序之計數排序排序
- golang reflect 實現原理Golang
- Golang 心跳的實現Golang
- (戀上資料結構筆記):計數排序、基數排序 、桶排序資料結構筆記排序
- php實現 歸併排序,快速排序PHP排序
- 【資料結構與演算法】非比較排序(計數排序、桶排序、基數排序)資料結構演算法排序
- 三言兩語說清【基數排序】與【計數排序】排序
- 計數排序 - Counting Sort排序
- 什麼是計數排序?排序
- GO 實現快速排序Go排序
- js 實現堆排序JS排序
- 快速排序 java實現排序Java
- Swift實現快速排序Swift排序
- java實現快速排序Java排序
- 快速排序(java實現)排序Java
- 堆排序(php實現)排序PHP
- 希爾排序java實現排序Java
- 快速排序的實現排序
- map/reduce實現 排序排序
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- Golang實現ForkJoin小文Golang
- 利用 Watermill 實現 Golang CQRSGolang