一、计数排序是什么
计数排序(counting sort)就是一种牺牲内存空间来换取低时间复杂度的排序算法,同时它也是一种不基于比较的算法。
二、计数排序步骤
- 1.找出
数列arr
中最大值max
与最小值min
. - 2.创建一个长度为
最大值与最小值之差 + 1
的数组newArr[],并初始化为0. - 3.统计数列arr中每个为 i 的值的元素出现的次数,存入newArr的第
i-min
项. - 4.反向填充目标数组.将newArr遍历,并
i-min
(需使i-min
+min
变为i
)填充到arr数组中,每填充一个newArr[i-min]--
.
代码如下:
public void sort(int[] arr) {
int max = arr[0];
int min = arr[0];
for (int i = 0; i < arr.length; ++i) {
max = max >= arr[i] ? max : arr[i];
min = min <= arr[i] ? min : arr[i];
}
int[] newArr = new int[max - min + 1];
for (int i = 0; i < arr.length; ++i) {
newArr[arr[i] - min]++;
}
int j = 0;
for (int i = 0; i < newArr.length; i++) {
while (newArr[i] != 0) {
arr[j++] = i + min;
newArr[i]--;
}
}
}
代码测试结果:
如果要排序字符数组,可对照ASCII码进行此操作
总结
计数排序不是比较排序,排序的速度快于任何比较排序算法。
由于用来计数的数组newArr的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。且计数排序不能对浮点数排序。