echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075) 交流学习。
什么是计数排序
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。 [1] 当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(nlog(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(nlog(n)), 如归并排序,堆排序)
动图演示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kyoWnCLA-1606270269119)(www.runoob.com/wp-content/uploads/2019/03/countingSort.gif)]
Java代码实现
public class Test {
public static void main(String[] args) {
int[] arr = {1, 3, 6, 9, 2, 5, 11, 4, 8};
print("原数组: ", arr);
sort(arr);
print("排序后的数组: ", arr);
}
public static int[] sort(int[] arr) {
int maxValue = getMaxValue(arr);
return countingSort(arr, maxValue);
}
private static int[] countingSort(int[] arr, int maxValue) {
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]--;
}
}
return arr;
}
private static int getMaxValue(int[] arr) {
int maxValue = arr[0];
for (int value : arr) {
if (maxValue < value) {
maxValue = value;
}
}
return maxValue;
}
private static void print(String str, int[] arr) {
for (int i = 0; i <= arr.length - 1; i++) {
if (i == 0) {
System.out.print(str + "[" + arr[i] + ", ");
} else if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ", ");
}
}
System.out.println();
}
}
核心原理
先找出整个需要排序的数据集中的最大值,然后构建一个以最大值为长度的数组,利用该数组,记录整个需要排序的数据集中的数据出现的次数,完成之后,利用记录数组的下标来完成排序
算法过程如下
- 第一步:找出原数组中最大元素
- 第二步:以最大元素为长度构建数组
- 第三步:遍历原数组,使用新构建的数组来计数(小标的大小对应元素组的元素,没匹配上一次加1
- 第四步:遍历新构建的数组,排除为0的元素,将剩余的元素返回
时间复杂度
O(n+k)
计数排序的优缺点
优点:简单、高效
缺点:存在空间浪费
适用场景
适合于数据量比较小,而且需要时整数集的数据
280

被折叠的 条评论
为什么被折叠?



