#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...