計數排序Counting sort

2021-07-25 22:49:46 字數 1780 閱讀 9819

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

python計數排序 Python 計數排序

1.python coding utf 8 def counting sort a,b,k 計數排序,偽碼如下 counting sort a,b,k 1 for i 0 to k 初始化儲存區的值 2 do c i 0 3 for j 1 to length a 為各值計數 4 do c a j ...

排序 計數排序

資料結構和演算法系列目錄 不斷更新 計數排序是一種線性時間的排序,它的時間複雜程度為o n 雖然是線性的時間複雜程度,但是它的空間複雜程度比較高,而且用之前需要有乙個硬性的前提。這個前提在後面給出,這裡先來簡單介紹一下計數排序。計數排序是先掃瞄一邊待排序陣列,並用乙個輔助陣列記錄待排序每個元素應該在...

排序 計數排序

計數排序假設n個輸入元素中的每乙個都是在0到k區間內的乙個整數,其中k為某個整數。當k o n 時,排序的執行時間為 n 計數排序的基本思想是 對每乙個輸入元素x,確定小於x的元素個數。利用這一資訊,就可以直接把x放到它在輸出陣列中的位置上了。例如,如果有17個元素小於x,則x就應該在第18個輸出位...