/** * 計數排序假設n個輸入元素中的每一個都是介於0和k之間的整數, 此處k為某個整數 *基本思想為:對每一個輸入元素經,確定出小於x的元素個數,這樣就可以把x直接放到它在最終輸出數組中的位置上。 *演算法複雜度為O(n+k),當k=O(n)時,其已耗用時間為O(n) *另一個特點:計數排序是穩定的,具有相同值的元素在輸出數組中的相對次序與它們在輸入數組中的次序相同 */public class CountingSort {/** * @param a //存放需要排序的原數組 * @param b //存放排序結果的數組 * @param k //a中的每個元素都介於0和k之間 */static void countingSort(int a[],int b[],int k){//c數組為臨時儲存區,c儲存從0到k每個元素在a中出現的次數,故c的長度為k+1。int c[]= new int[k+1];//c[i]中存放了等於i的元素的個數(0=< i <=k)for(int i = 0;i<a.length;i++)c[a[i]]++;//c[i]存放小於或等於i的元素個數for(int i = 1;i<=k;i++)c[i]=c[i]+c[i-1];//由於c[i]存放小於等於i的元素個數,所以i應該放在b數組中的c[i]位置(由於數組從0開始,所以要減1)for(int r = a.length-1;r>=0;r--){int i = a[r];b[c[i]-1] = i;//每次c[i]減1可以保證下一個等於i的相同元素,落在b[c[i]-1]的前一個位置c[i]--;}}//測試.....public static void main(String[] args) {int a[]={2,5,3,0,2,3,0,3};int b[]= new int[8];countingSort(a,b,5);for(int i =0;i<b.length;i++)System.out.println(b[i]);}}