//什么是计数排序
桶排序一种 通过装下 值的个数来实现排序.
具体点说就是 接受一个数组 把数组里不同的数字放到不同的"桶" (两个一样的值就++) 里面由于桶内的数据本身有序(都是同一个值) 然后只要把桶进行排序 整个排序就实现了.
举个例子 要对 int[] A = { 1 5 6 7 8 } 进行桶排序 首先找到 A 的最大值和最小值 方便创建桶 (这里的桶指的是).
然后把A的值分别放对应的桶里 (值为1就放到桶名为的1桶).
在这里我们创建创建长度为( 8 -1 )的数组 // 最终 数组就是 [1 , 0 ,0 ,0 ,1 ,1 ,1].
// 在这里我解释一下 两个问题 1 加入数组的值为多少一定是1吗? 数组长度问题? 桶名问题
1 不一定 前面说了“两个一样的值就++” 如果数组中的7出现两次就++两次结果是2
2 创建长度为多少的数组是由 value.max 和 value.min 算出来的
3 桶名怎么实现: 在这里直接用数组下标 下标为0 你就把它当作桶0 但是我们这里数组长度为7 但是数组下标从0开始.所以最大的桶是桶7 本来下标对应 现在你就多加上value.min // 下标为0 你就把它当作桶 0 +value.min
桶也完成了 那之后怎么做呢 遍历所有桶 对值不为0的进行--并插入数组
//数组实现
public int[] sortArray(int[] nums) {
int max = Arrays.stream(nums).max().getAsInt();
int min = Arrays.stream(nums).max().getAsInt();
//桶
int[] ints = new int[ max - min ];
for (int a :
nums) {
//把值插入数组 桶是从 min 到 max 值是 a = 1 应该放到第一个位置
//从结果看是 a - min
ints[a-min]++;
}
int key = 0;
// 对桶排序并取出
for (int i = 0; i < ints.length; i++) {
for (int j = 0; j < ints[i]; j++){
nums[key++] = i;
}
}
return nums;
}
注意 在桶名那里你可以说我就不用max - min 直接用 max 那当然也可以空间上浪费了一点
理论上计数排序不对负数进行排序 数组下标不为负数 下标+value.min也不好实现