- 代码:
/**
* @Description:
* 计数排序统计小于等于该元素值的元素的个数i,于是该元素就放在目标数组的索引i位(i≥0)。
* 计数排序基于一个假设,待排序数列的所有数均为整数,且出现在(0,k)的区间之内。
* 如果 k(待排数组的最大值) 过大则会引起较大的空间复杂度,一般是用来排序 0 到 100 之间的数字的最好的算法,但是它不适合按字母顺序排序人名。
* 计数排序不是比较排序,排序的速度快于任何比较排序算法。
* 算法思想:
* 找出待排序的数组中最大和最小的元素;
* 统计数组中每个值为 i 的元素出现的次数,存入数组 C 的第 i 项;
* 对所有的计数累加(从 C 中的第一个元素开始,每一项和前一项相加);
* 向填充目标数组:将每个元素 i 放在新数组的第 C[i] 项,每放一个元素就将 C[i] 减去 1;
* 平均时间复杂度:O(N + M)
* 最优时间复杂度:O(N + M)
* 最差时间复杂度:O(N + M)
* 稳定性:稳定
* @Author: chong
* @Data: 2021/6/22 3:07 下午
*/
public class CountSortTemplate {
public void countSort(int[] nums){
if (nums.length == 0)
return;
// 找到数组内最大值
int maxValue = nums[0];
for (int num : nums)
maxValue = Math.max(maxValue, num);
// 创建辅助数组
int[] bucket = new int[maxValue + 1];
// 放入桶中
for (int num : nums) {
bucket[num]++;
}
// 从桶中拿出
for (int i = 0, j = 0; i < nums.length;){
if (bucket[j]-- > 0)
nums[i++] = j;
else
j++;
}
}
}