計數排序演算法詳解

2021-06-21 07:41:26 字數 1884 閱讀 5215

經典排序演算法 - 計數排序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...