計數排序法:用一個數組從小到大記錄數組中相應大小數的次數,然後遍歷這個數組記錄的次數排序。
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. 只適合整數,如果是小數,數組的座標是整數,不適合記錄。