计数排序
计数排序适用于量大范围小的序列,通过统计范围内每个数出现的次数,根据出现次数依次排序。
算法步骤
找出待排序序列中最大值,遍历该序列统计范围内每个值出现的次数,根据出现的次数依次排序。
代码实现
public static int[] countSort(int[] nums) {
if (nums.length < 2) {
return nums;
}
//找出最大值
int max = nums[0];
for (int i = 1;i < nums.length;i++) {
if (max < nums[i]) {
max = nums[i];
}
}
//遍历原序列进行计数
int[] countArr = new int[max + 1];
for (int i = 0;i < nums.length;i++) {
countArr[nums[i]]++;
}
//通过计数序列排序
// for (int i = 0, j = 0;i < countArr.length;i++) {
// while (countArr[i]-- > 0) {
// nums[j++] = i;
// }
// }
//累加计数数组各个数累计在第几次出现
for (int i = 1;i < countArr.length;i++) {
countArr[i] += countArr[i - 1];
}
//计算对应数字应该存放的位置
int[] resArr = new int[nums.length];
for (int i = 0;i < nums.length;i++) {
resArr[--countArr[nums[i]]] = nums[i];
}
return resArr;
}