计数排序适用于对在一定范围内的整数排序.时间复杂度是n+k,k为max-min
代码:
public int[] countingSort(int[] arr, boolean reverse) {
//计数排序
int min = arr[0],
max = arr[0],
len = arr.length;
// 1.求最大最小值,计算出差值d
for (int i = 0; i < len; i++) {
max = Math.max(arr[i], max);
min = Math.min(arr[i], min);
}
int d = max - min;
//2.创建统计数组,并统计对应元素个数
int[] countArray = new int[d + 1];
for (int i = 0; i < len; i++) {
int demp = reverse ? max - arr[i] : arr[i] - min;
countArray[demp] += 1;
}
int sum = 0;
//3.统计数组做变形,后面的元素等于前面的元素之和,也就是排名数组
//countArray[i]的值即为原数组中对应排序位置
for (int i = 0; i < d + 1; i++) {
sum += countArray[i];
countArray[i] = sum;
}
int[] res = new int[len];
//4. 遍历原始数组, 从统计数组中找到原数组元素的排序位置, 输出到结果数组
for (int i = 0; i < len; i++) {
int demp = reverse ? max - arr[i] : arr[i] - min;
res[countArray[demp] - 1] = arr[i];
countArray[demp]--;
}
return res;
}