算法__計數排序法

計數排序法:用一個數組從小到大記錄數組中相應大小數的次數,然後遍歷這個數組記錄的次數排序。

91 95 99 94 96 91 92 93

1. 創建一個數組記錄相應數字出現次數的數組;

   數組的大小 = 最大數字 -最小數字 +1; size = 99  -   91 +  1  =  9;

2. 遍歷數組,用新數組記錄次數;(用最小的數 91,作爲偏移量)

    91  -  91 =  0;(座標  0  的值  +1)

1 0 0 0 0 0 0 0 0

    95  -  91 =  4;  (座標  4  的值   +1)

1 0 0 0 1 0 0 0

    99  -  91  =  8;

1 0 0 0 1 0 0 1

    94  -  91  =  3;

1 0 0 1 1 0 0 1

    96  -  91  =  5;

1 0 0 1 1 1 0 1

    91  -  91  =  0;

2 0 0 1 1 1 0 1

    92  -  91  =  1;

2 1 0 1 1 1 0 1

    93  -  91  =  2;

2 1 1 1 1 1 0 1

 3.  然後,遍歷這個新數組。座標的值是多少,就輸出幾次值。

      值 =  最小值  +  座標;

      0  座標   2:    輸出2次值,   值=最小值  +  座標  =  91 + 0  =  91; 

91 91            

      1  座標   1:     輸出1次值,   值=91 + 1 = 92;

91 91 92          

      ...

91 91 92 93 94 95 96 99

代碼如下:

//計數法
    private int[] countSort(int arry[]) {
        //數組的最大值和最小值
        int min = arry[0], max = arry[0];
        for (int i = 0; i < arry.length; i++) {
            if (arry[i] > max) {
                max = arry[i];
            }

            if (arry[i] < min) {
                min = arry[i];
            }
        }

        //數組的計數
        int size = max - min + 1;
        int[] arryCount = new int[size];
        for (int i = 0; i < arry.length; i++) {
            arryCount[arry[i] - min]++;
        }

        //排序
        int size1 = 0;
        int[] sortedArray = new int[arry.length];
        for (int i = 0; i < arryCount.length; i++) {
            for (int j = 0; j < arryCount[i]; j++) {
                arry[size1] = min + i;
                size1++;
            }
        }
        return sortedArray;
    }

優點:不需要相鄰的兩個值互相比較,時間複雜度較小;

缺點:1. 只適合最大值和最小值差值小的數組 ,差值太大浪費太大;

          2. 只適合整數,如果是小數,數組的座標是整數,不適合記錄。

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