刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!
/**
* 计数排序
* <p>
* 找出待排序的数组中最大和最小的元素;
* 统计数组中每个值为我的元素出现的次数,存入数组Ç的第我项;
* 对所有的计数累加(从ç中的第一个元素开始,每一项和前一项相加);
* 反向填充目标数组:将每个元素我放在新数组的第C(ⅰ)项,每放一个元素就将C(ⅰ)减去1。
*
* @param arr
* @return
*/
public static int[] countingSort(int[] arr) {
int minV = arr[0], maxV = arr[0];
for (int i = 1; i < arr.length; i++) {
if (minV > arr[i]) {
minV = arr[i];
}
if (maxV < arr[i]) {
maxV = arr[i];
}
}
int gap = maxV - minV + 1;
int[] countArr = new int[gap];
for (int i = 0; i < arr.length; i++) {
countArr[arr[i] - minV] += 1;
}
for (int i = 1; i < gap; i++) {
countArr[i] += countArr[i - 1];
}
int[] result = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
/**
* countArr[arr[i] - minV] - 1 当前arr[i]可以放的最右的位置,每放一次往前移一位
*/
result[countArr[arr[i] - minV] - 1] = arr[i];
countArr[arr[i] - minV] -= 1;
}
return result;
}
本文链接:Java版计数排序
版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!
