计数排序
计数排序
计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
1. 动图演示
2. Java 代码实现
/**
* 计数排序
*
* @param arr
*/
public static void countingSort(Integer[] arr) {
System.out.println("countingSort===");
PrintUtil.printArr(arr);
int maxValue = getMaxValue(arr);
int bucketLen = maxValue + 1;
int[] bucket = new int[bucketLen];
for (int value : arr) {
// 计数
bucket[value]++;
}
int sortedIndex = 0;
for (int j = 0; j < bucketLen; j++) {
while (bucket[j] > 0) {
// 重新写入值
arr[sortedIndex++] = j;
// 计数减一
bucket[j]--;
}
}
// after
PrintUtil.printArr(arr);
}
/**
* 找最大值 确定长度
*
* @param arr
* @return
*/
private static int getMaxValue(Integer[] arr) {
int maxValue = arr[0];
for (int value : arr) {
if (maxValue < value) {
maxValue = value;
}
}
return maxValue;
}