算法——排序之計數排序

最近想到算法導論中的計數排序,看看理解的怎麼樣試着講講自己的理解。

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+" ");
        }
    }
}
這樣就會看到 原本的數據 已經排好序了……

有問題,歡迎討論……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章