1. 思路
类似哈希法 ,使用位置数组放置每个元素,遍历数组。
2. 过程
- 获取数组最大值,创建这么大空间的数组
- 遍历原数组,把每个数对应数值的索引数量++
- 遍历新数组,把值复原到原数组中
3. 代码
public static void countSort(int[]arr) {
if (arr == null || arr.length < 2) {
return;
}
//找到数组中元素的最大值
int max = Integer.MIN_VALUE;
for (int i = 0; i < arr.length; i++) {
max = Math.max(max, arr[i]);
}
// arr 中的数字 >=0
int[] bucket = new int[max + 1];
//把数放到桶中的对应位置
for (int i = 0; i < arr.length; i++) {
bucket[arr[i]]++;
}
int i = 0;
//直接遍历桶
for (int j = 0; j < bucket.length; j++) {
while (bucket[j] > 0) {
//当前位置本数字次数 减 1
bucket[j]--;
// 把当前位置排到原始数组中
arr[i] = j;
i++;
}
}
}