计数排序Counting sort
注意與基數(shù)排序區(qū)分,這是兩個(gè)不同的排序
計(jì)數(shù)排序的過程類似小學(xué)選班干部的過程,如某某人10票,作者9票,那某某人是班長(zhǎng),作者是副班長(zhǎng)
大體分兩部分,第一部分是拉選票和投票,第二部分是根據(jù)你的票數(shù)入桶
看下具體的過程,一共需要三個(gè)數(shù)組,分別是待排數(shù)組,票箱數(shù)組,和桶數(shù)組
var unsorted = new int[] { 6, 2, 4, 1, 5, 9 };? //待排數(shù)組
var ballot = new int[unsorted.Length];????????? //票箱數(shù)組
var bucket = new int[unsorted.Length];????????? //桶數(shù)組
最后再看桶數(shù)組,先看待排數(shù)組和票箱數(shù)組
初始狀態(tài),迭代變量i = 0時(shí),待排數(shù)組[i] = 6,票箱數(shù)組[i] = 0,這樣通過迭代變量建立了數(shù)字與其桶號(hào)(即票數(shù))的聯(lián)系
待排數(shù)組[?6?2 4 1 5 9 ]?i = 0時(shí),可以從待排數(shù)組中取出6
票箱數(shù)組[?0?0 0 0 0 0 ]?同時(shí)可以從票箱數(shù)組里取出6的票數(shù)0,即桶號(hào)
拉選票的過程
首先6出列開始拉選票,6的票箱是0號(hào),6對(duì)其它所有數(shù)字說,誰比我小或與我相等,就給我投票,不然揍你
于是,2 4 1 5 分別給6投票,放入0號(hào)票箱,6得四票
待排數(shù)組[ 6 2 4 1 5 9 ]
票箱數(shù)組[ 4 0 0 0 0 0 ]
?
接下來2開始拉選票,對(duì)其它人說,誰比我小,誰投我票,不然弄你!于是1投了一票,其他人比2大不搭理,心想你可真二
于是2從1那得到一票
待排數(shù)組[ 6 2 4 1 5 9 ]
票箱數(shù)組[ 4 1 0 0 0 0 ]
?
再然后是,
4得到2和1的投票,共計(jì)兩票
1得到0票,沒人投他
5得到2,4,1投的三張票
9是最大,得到所有人(自己除外)的投票,共計(jì)5票(數(shù)組長(zhǎng)度-1票)
?
投票完畢時(shí)的狀態(tài)是這樣
待排數(shù)組[ 6 2 4 1 5 9 ]
票箱數(shù)組[ 4 1 2 0 3 5 ]
?
入桶的過程
投票過程結(jié)束,每人都擁有自己的票數(shù),桶數(shù)組說,看好你自己的票數(shù),進(jìn)入與你票數(shù)相等的桶,GO
6共計(jì)5票,進(jìn)入5號(hào)桶
2得1票,進(jìn)入1號(hào)桶,有幾票就進(jìn)幾號(hào)桶
4兩票,進(jìn)2號(hào)桶,5三票進(jìn)3號(hào)桶,9有5票,進(jìn)5號(hào)桶
待排數(shù)組[ 6 2 4 1 5 9 ]
票箱數(shù)組[ 4 1 2 0 3 5 ]
-----------------------
入桶前 [?0?1 2 3 4 5 ] //里邊的數(shù)字表示桶編號(hào)
入桶后 [?1?2 4 5 6 9 ] //1有0票,進(jìn)的0號(hào)桶
排序完畢,順序輸出即可[ 1 2 4 5 6 9]
?
可以看到,數(shù)字越大票數(shù)越多,9得到除自己外的所有人的票,5票,票數(shù)最多所以9最大,
每個(gè)人最多擁有[數(shù)組長(zhǎng)度減去自己]張票
1票數(shù)最少,所以1是最小的數(shù),
計(jì)數(shù)排序同時(shí)兼有桶排的高效和快排的霸道,
?
完成代碼如下
var unsorted = new int[] { 6, 2, 4, 1, 5, 9 }; //待排數(shù)組var ballot = new int[unsorted.Length]; //票箱數(shù)組var bucket = new int[unsorted.Length]; //桶數(shù)組for (int i = 0; i < bucket.Length; i++){//unsorted[i] = 6//ballot[i]是6的票箱,里邊有4張票//bucket[ballot[i]] = unsorted[i];//bucket[4張票] = 6;bucket[ballot[i]] = unsorted[i];}for (int i = 0; i < bucket.Length; i++){Console.WriteLine(bucket[i]);}
轉(zhuǎn)載于:https://www.cnblogs.com/jxhd1/p/6528107.html
總結(jié)
以上是生活随笔為你收集整理的计数排序Counting sort的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git提交的错误
- 下一篇: 汇编中16进制的写法问题