生活随笔
收集整理的這篇文章主要介紹了
【算法精解】计数排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【算法精解】計數排序
基本認識:是一個特殊的桶排序。基于比較排序的排序方法,其復雜度無法突破nlogn 的下限,但是非比較排序卻可以突破該下限,甚至達到O(n)的時間復雜度。當有n個數據時,所處的范圍并不大,最大值是k,那么就劃分k個桶。每個桶都存儲相同的數據。這樣可以省掉桶內排序的時間。時間復雜度:因為整個過程只涉及到掃描遍歷操作,所以時間復雜度是O(n+k)。【n為元素個數,k為待排序最大值與最小值之差】優缺點:適用于待排序數據的范圍不大的情況,若范圍比較大,會產生很多空桶,造成空間浪費。適用場景:以高考為例,假設某省有50萬考生,高考成績滿分是750分,我們可以分配751個桶(最低0分,最高750分),遍歷50萬考生的成績,劃分到751個桶中,最后只需要依次掃描桶,就可以輸出排序好的數據。排序思路
對A[8]進行排序,其中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的數據再A[]中有兩個
2、對C[6]數組順序求和,C[k]存儲小于等于分數k的考生個數,C[6]={2,2,4,7,7,8}。//C[1]=2的含義為:A[]中 <= 1的值有兩個
3、新建一個數據R[8]用于存儲排序好的數據。
4、從后向前遍歷數據A[8],A[8]的倒數第一個數為3,C[6]下標為3的數為7,表明數組A中小于等于3的有7個人,所以講這個3放入R[8]的第7個位置,C[6]下標為3位置的數變為7-1=6。此時R[8]={0,0,0,0,0,0,3,0},C[6]={2,2,4,6,7,8}。
5、依次類推,掃描A[8]剩下的數據。最后R[8]就是排序好的數據。
Java代碼實現
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("待排序數據:" + Arrays
.toString(beforArr
));int[] afterArr
= countingSort(beforArr
);System
.out
.println("排序之后數據:" + 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
;}
}
▄█?█●各位同仁,如果我的代碼對你有幫助,請給我一個贊吧,為了下次方便找到,也可關注加收藏呀
如果有什么意見或建議,也可留言區討論
總結
以上是生活随笔為你收集整理的【算法精解】计数排序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。