计数排序适用于一定范围内的整数排序。在取值范围不是很大的情况下,它的性能甚至快过那些时间复杂度为O(nlogn)的排序。计数排序,理想情况下时间复杂度可为O(n),即每一个索引位只有一个元素。
注意点:
当数列最大和最小值差距过大时,并不适合用计数排序。
当数列元素不是整数时,也不适合用计数排序。
public class CountSort {
public static void main(String[] args) {
CountSort countSort = new CountSort();
int[] array = {2, 4, 2, 5, 8, 9, 5, 5};
Arrays.stream(countSort.countSort(array)).forEach(a->{
System.out.print(a + " ");
});
}
private int[] countSort(int[] array) {
//获取数组中的最大值
int max = array[0];
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
//填充计数数组
int[] countArray = new int[max + 1];
for (int i = 0; i < array.length; i++) {
countArray[array[i]]++;
}
//遍历统计数组
int index = 0;
int[] sortArray = new int[array.length];
for (int i = 0; i < countArray.length; i++) {
for (int j = 0; j < countArray[i]; j++) {
sortArray[index++] = i;
}
}
return sortArray;
}
}