计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

package sort;
/**
* 计数排序
*/
public class CountingSort {
public static void main(String[] args) {
int[] o = {7, 6, 9, 3, 1, 5, 2, 4, 8};
System.out.print("排序前: ");
for (int t : o) {
System.out.print(t);
System.out.print(" ");
}
System.out.println();
// 算法部分
int maxValue = getMaxValue(o);
int bucketLen = maxValue + 1;
int[] bucket = new int[bucketLen];
for (int value : o) {
bucket[value]++;
}
int sortedIndex = 0;
for (int j = 0; j < bucketLen; j++) {
while (bucket[j] > 0) {
o[sortedIndex++] = j;
bucket[j]--;
}
}
System.out.print("排序后: ");
for (int t : o) {
System.out.print(t);
System.out.print(" ");
}
System.out.println();
}
private static int getMaxValue(int[] arr) {
int maxValue = arr[0];
for (int value : arr) {
if (maxValue < value) {
maxValue = value;
}
}
return maxValue;
}
}
执行结果
排序前: 7 6 9 3 1 7 2 4 8
排序后: 1 2 3 4 6 7 7 8 9
待排序的元素的数据范围为 C C C(常数),待排序的元素个数是 N N N个。计数排序不是比较排序,它只是去访问了每个元素一下,这样时间复杂度就是 O ( C + N ) = O ( N ) O(C+N)=O(N) O(C+N)=O(N)
由于我们申请了大小为 N N N 的计数数组来放元素,所以空间复杂度是 O ( N ) O(N) O(N)。