计数排序
原数组:9, 3, 5, 4, 9, 1, 2, 7, 8, 1, 3, 6, 5, 3, 4, 0, 10, 9, 7, 9(长度20)
找出最小值(min = 0
)和最大值(max = 10
)
新建新数组(长度为max - min + 1
,即10 - 0 + 1 = 11
)
将原数组的值对应一定规律的索引(原数组值 - 原数组最小值作为新数组的索引)
进行次数记录到新数组里面
次数 | 1 | 2 | 1 | 3 | 2 | 2 | 1 | 2 | 1 | 4 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|
索引(索引和值保持规律) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
之后再将新数组里面的索引按一定规律
(原数组值 - 原数组最小值作为新数组的索引)
恢复成值,然后根据次数去重新赋值到原数组即排序完成
public class CountSortTest {
public static void main(String[] args) {
int[] arr = {9, 3, 5, 4, 9, 1, 2, 7, 8, 1, 3, 6, 5, 3, 4, 0, 10, 9, 7, 9};
int[] sorts = countSort(arr);
System.out.println(Arrays.toString(sorts));
}
public static int[] countSort(int[] arr) {
int length = arr.length;
int min = arr[0];
int max = arr[0];
for (int i = 0; i < length; i++) {
if (min > arr[i]) {
min = arr[i];
}
if (max < arr[i]) {
max = arr[i];
}
}
int tempLen = max - min + 1;
int[] temp = new int[tempLen];
for (int i = 0; i < length; i++) {
temp[arr[i] - min]++;
}
int k = 0;
for (int i = 0; i < tempLen; i++) {
for (int j = temp[i]; j > 0; j--) {
arr[k++] = i + min;
}
}
return arr;
}
}