生活随笔
收集整理的這篇文章主要介紹了
【算法精解】计数排序
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【算法精解】計(jì)數(shù)排序
基本認(rèn)識(shí):是一個(gè)特殊的桶排序?;诒容^排序的排序方法,其復(fù)雜度無(wú)法突破nlogn 的下限,但是非比較排序卻可以突破該下限,甚至達(dá)到O(n)的時(shí)間復(fù)雜度。當(dāng)有n個(gè)數(shù)據(jù)時(shí),所處的范圍并不大,最大值是k,那么就劃分k個(gè)桶。每個(gè)桶都存儲(chǔ)相同的數(shù)據(jù)。這樣可以省掉桶內(nèi)排序的時(shí)間。時(shí)間復(fù)雜度:因?yàn)檎麄€(gè)過(guò)程只涉及到掃描遍歷操作,所以時(shí)間復(fù)雜度是O(n+k)。【n為元素個(gè)數(shù),k為待排序最大值與最小值之差】優(yōu)缺點(diǎn):適用于待排序數(shù)據(jù)的范圍不大的情況,若范圍比較大,會(huì)產(chǎn)生很多空桶,造成空間浪費(fèi)。適用場(chǎng)景:以高考為例,假設(shè)某省有50萬(wàn)考生,高考成績(jī)滿(mǎn)分是750分,我們可以分配751個(gè)桶(最低0分,最高750分),遍歷50萬(wàn)考生的成績(jī),劃分到751個(gè)桶中,最后只需要依次掃描桶,就可以輸出排序好的數(shù)據(jù)。排序思路
對(duì)A[8]進(jìn)行排序,其中A[8] = {0,2,3,5,2,3,0,3},min=0,max=5
1、遍歷A[8],得到C[6]={2,0,2,3,0,1}。//C[0]=2的含義為:值為0的數(shù)據(jù)再A[]中有兩個(gè)
2、對(duì)C[6]數(shù)組順序求和,C[k]存儲(chǔ)小于等于分?jǐn)?shù)k的考生個(gè)數(shù),C[6]={2,2,4,7,7,8}。//C[1]=2的含義為:A[]中 <= 1的值有兩個(gè)
3、新建一個(gè)數(shù)據(jù)R[8]用于存儲(chǔ)排序好的數(shù)據(jù)。
4、從后向前遍歷數(shù)據(jù)A[8],A[8]的倒數(shù)第一個(gè)數(shù)為3,C[6]下標(biāo)為3的數(shù)為7,表明數(shù)組A中小于等于3的有7個(gè)人,所以講這個(gè)3放入R[8]的第7個(gè)位置,C[6]下標(biāo)為3位置的數(shù)變?yōu)?-1=6。此時(shí)R[8]={0,0,0,0,0,0,3,0},C[6]={2,2,4,6,7,8}。
5、依次類(lèi)推,掃描A[8]剩下的數(shù)據(jù)。最后R[8]就是排序好的數(shù)據(jù)。
Java代碼實(shí)現(xiàn)
public class Order {public static void main(String
[] args
) {int[] beforArr
= {13, 19, 15, 11, 7, 11, 25, 21, 29, 17, 15, 14, 17, 29, 28, 22};System
.out
.println("待排序數(shù)據(jù):" + Arrays
.toString(beforArr
));int[] afterArr
= countingSort(beforArr
);System
.out
.println("排序之后數(shù)據(jù):" + Arrays
.toString(afterArr
));}public static int[] countingSort(int[] beforArr
){int max
= beforArr
[0];int min
= beforArr
[0];for (int arr
: beforArr
) {if (arr
> max
){max
= arr
;}if (arr
< min
){min
= arr
;}}int size
= max
- min
+ 1;int[] bucket
= new int[size
];for (int i
=0; i
<beforArr
.length
; i
++){bucket
[beforArr
[i
]-min
] ++;}for (int i
=1; i
< size
; i
++){bucket
[i
] = bucket
[i
] + bucket
[i
-1];}int[] afterArr
= new int[beforArr
.length
];for (int i
=beforArr
.length
-1; i
>=0; i
--){int index
= bucket
[beforArr
[i
]-min
] - 1;afterArr
[index
] = beforArr
[i
];bucket
[beforArr
[i
]-min
] --;}return afterArr
;}
}
▄█?█●各位同仁,如果我的代碼對(duì)你有幫助,請(qǐng)給我一個(gè)贊吧,為了下次方便找到,也可關(guān)注加收藏呀
如果有什么意見(jiàn)或建議,也可留言區(qū)討論
總結(jié)
以上是生活随笔為你收集整理的【算法精解】计数排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。