最近想到算法導論中的計數排序,看看理解的怎麼樣試着講講自己的理解。
1、思想:
計數排序 是 線性時間的 排序算法,時間複雜度爲O(n),雖然有一定的侷限性。但是還是很好的一種算法。
用2個數組進行額外的存儲信息,數組 c[ ] 是對 數據中值相同的 記錄下來,以便後面查閱;b[ ]是輸出的有序數組,再將有序的數組輸出。
2、範圍:
計數排序是針對 在 一定取值範圍 的 整數 數據。比如:a[ ]中 a[ i ]∈( 0 , 10 )。
3、代碼:
public class CountingSort {
public static int[] sort(int []a,int k){ // a 是輸入數組 k 是可取的最大值 即取值在 (0,k)範圍內
int num = a.length;
int []b = new int[num]; // 輸出的有序數組
int []c = new int[k]; //臨時計數數組
for(int i=0;i<num;i++){ //初始化數組
b[i]=0;
c[i]=0;
}
for(int i=0;i<num;i++){ //對 a 中值都爲 a[i] 的數據進行計數 並記錄c[a[i]] 中,如 c[5] = 3 就表示 a[]中有 3個 值爲 5 的數據。
c[a[i]] +=1;
}
for(int i=1;i<k;i++){ //對整體進行計數累加
c[i]+=c[i-1];
}
for(int i=num-1;i>=0;i--){ //對a[] 中數據倒序訪問進行賦值到 b[]中 這樣a[i]就會到它排序後應該在的位置了
b[--c[a[i]]] = a[i];
}
return b;
}
public static void main(String[] args) {
int []a = {2,5,7,4,9,5,7,2,6,0};
for(int i:a){
System.out.print(i + " ");
}
System.out.println();
a = sort(a,10);
for(int i:a){
System.out.print(i+" ");
}
}
}
這樣就會看到 原本的數據 已經排好序了……
有問題,歡迎討論……