计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
算法步骤
1.找出待排序的数组中最大和最小的元素
2.统计数组中每个值为i的元素出现的次数,存入数组C的第i项
3.对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
4.反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
动图演示

复杂度
时间复杂度 = O(n + k)空间复杂度 = O(n)
代码实现
public static void countingsort(int[] arr,int min, int max) {
int[] arrs = new int[arr.length];
int[] nums = new int[max - min + 1];
//数组 计数
for (int i = 0; i < arr.length; i++) {
nums[arr[i] - min]++;
}
//计数累加
for (int i = 1; i < nums.length; i++) {
nums[i] += nums[i - 1];
}
//反向填充
for (int i = arr.length - 1; i >= 0; i--) {
int number = arr[i];
int count = nums[number];
arrs[count - 1] = number;
nums[number]--;
}
}
网友评论