排序演算法之 計數排序法 八

2021-07-15 11:16:44 字數 2331 閱讀 8098

#include

#include

#include

#include

#define len 20

void show(int

str);

void *malloc(int size);

void show(int

str)

}void *malloc(int size)

return result;

} void count_sort(int *array, int length, int min, int max)

// for(i = 0, j = 0; i < c_size; ++i)

// }

//從min到max,把個數非0的數字依次進行尾部插入

for(i = 0, j = 0; i < c_size;)else

}free(count);

}int main()

str[14] = 99;

str[2] = 0;

show(str);

printf("排序前:\n");

count_sort(str,len,0,99);

printf("排序後:\n");

show(str);

return0;}

排序前:

41670

0692478

5862645

4581

2799

9195

4227

36排序後:

00524

2727

3641

4245

5862

6467

6978

8191

9599

press any key to continue

注意與基數排序區分,這是兩個不同的排序

計數排序的過程類似小學選班幹部的過程,如某某人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是最小的數

排序演算法之計數排序

今在學習中,遇到計數排序演算法,雖然其對待排序的序列要求嚴格,但對於符合條件的序列來說,其時間複雜度很小。故列於此,僅為學習記憶。參考資料 對於僅由大寫字母 或小寫字母 構成的無序序列,可採用下面演算法進行排序。該演算法不在序列的每個元素間進行比較,而是使用了乙個額外的help整型字串來記錄每個元素...

演算法 排序之計數排序

最近想到演算法導論中的計數排序,看看理解的怎麼樣試著講講自己的理解。1 思想 計數排序 是 線性時間的 排序演算法,時間複雜度為o n 雖然有一定的侷限性。但是還是很好的一種演算法。用2個陣列進行額外的儲存資訊,陣列 c 是對 資料中值相同的 記錄下來,以便後面查閱 b 是輸出的有序陣列,再將有序的...

排序演算法之計數排序

計數排序的思想特別簡單,就是記錄下序列中每個元素出現的次數,然後根據儲存次數的下標及出現次數將元素放回原陣列。時間複雜度為o n 資料範圍 空間複雜度為o 最大數 最小數 實現 pragma once int findmax int array,const int size return max i...