經典排序演算法 - 計數排序counting sort
注意與基數排序區分,這是兩個不同的排序
計數排序的過程類似小學選班幹部的過程,如某某人10票,作者9票,那某某人是班長,作者是副班長
大體分兩部分,第一部分是拉選票和投票,第二部分是根據你的票數入桶
看下具體的過程,一共需要三個陣列,分別是待排陣列,票箱陣列,和桶陣列
var unsorted = new int ; //待排陣列
var ballot = new int[unsorted.length]; //票箱陣列
var bucket = new int[unsorted.length]; //桶陣列
最後再看桶陣列,先看待排陣列和票箱陣列
初始狀態,迭代變數i = 0時,待排陣列[i] = 6,票箱陣列[i] = 0,這樣通過迭代變數建立了數字與其桶號(即票數)的聯絡
待排陣列[ 6 2 4 1 5 9 ] i = 0時,可以從待排陣列中取出6
票箱陣列[ 0 0 0 0 0 0 ] 同時可以從票箱陣列裡取出6的票數0,即桶號
拉選票的過程
首先6出列開始拉選票,6的票箱是0號,6對其它所有數字說,誰比我小或與我相等,就給我投票,不然揍你
於是,2 4 1 5 分別給6投票,放入0號票箱,6得四票
待排陣列[ 6 2 4 1 5 9 ]
票箱陣列[ 4 0 0 0 0 0 ]
接下來2開始拉選票,對其它人說,誰比我小,誰投我票,不然弄你!於是1投了一票,其他人比2大不搭理,心想你可真二
於是2從1那得到一票
待排陣列[ 6 2 4 1 5 9 ]
票箱陣列[ 4 1 0 0 0 0 ]
再然後是,
4得到2和1的投票,共計兩票
1得到0票,沒人投他
5得到2,4,1投的三張票
9是最大,得到所有人(自己除外)的投票,共計5票(陣列長度-1票)
投票完畢時的狀態是這樣
待排陣列[ 6 2 4 1 5 9 ]
票箱陣列[ 4 1 2 0 3 5 ]
入桶的過程
投票過程結束,每人都擁有自己的票數,桶陣列說,看好你自己的票數,進入與你票數相等的桶,go
6共計5票,進入5號桶
2得1票,進入1號桶,有幾票就進幾號桶
4兩票,進2號桶,5三票進3號桶,9有5票,進5號桶
待排陣列[ 6 2 4 1 5 9 ]
票箱陣列[ 4 1 2 0 3 5 ]
-----------------------
入桶前 [ 0 1 2 3 4 5 ] //裡邊的數字表示桶編號
入桶後 [1 2 4 5 6 9 ] //1有0票,進的0號桶
排序完畢,順序輸出即可[ 1 2 4 5 6 9]
可以看到,數字越大票數越多,9得到除自己外的所有人的票,5票,票數最多所以9最大,
每個人最多擁有[陣列長度減去自己]張票
1票數最少,所以1是最小的數,
計數排序同時兼有桶排的高效和快排的霸道,
完成**如下
var unsorted = new int ; //待排陣列
var ballot = new int[unsorted.length]; //票箱陣列
var bucket = new int[unsorted.length]; //桶陣列
for (int i = 0; i < bucket.length; i++)
for (int i = 0; i < bucket.length; i++)
**:
排序演算法 詳解計數排序演算法
計數排序是一種非比較排序,它適用於範圍比較集中的資料處理。臨時開闢乙個陣列,通過統計資料的個數,將資料集中,再將這個陣列展開,實現排序的過程。時間複雜度 o max n,範圍 空間複雜度 o 範圍 首先就是c語言對範圍檢查不是很嚴格,我開闢陣列的時候,僅僅開闢了max min個大小,最後也沒有釋放空...
計數排序詳解 O n
計數排序基本思路為 我們希望能線性的時間複雜度排序,如果乙個乙個比較,顯然是不實際的,書上也在決策樹模型中論證了,比較排序的情況為nlogn的複雜度。既然不能乙個乙個比較,我們想到乙個辦法,就是如果我在排序的時候就知道他的位置,那不就是掃瞄一遍,把他放入他應該的位置不就可以了嘛。要知道他的位置,我們...
演算法 排序 計數排序
計數排序不是基於比較的排序演算法,其核心在於將輸入的資料值轉化為鍵儲存在額外開闢的陣列空間中。作為一種線性時間複雜度的排序,計數排序要求輸入的資料必須是有確定範圍的整數。計數排序 counting sort 是一種穩定的排序演算法。計數排序使用乙個額外的陣列c,其中第i個元素是待排序陣列a中值等於i...