一、前言
计数排序是十大排序算法中效率最高的,因为它不需要进行比较,只要进行映射,所以效率非常的高。但是我们学习计数排序主要的还是要理解计数排序中运用到的核心:学会将数组的下标变得有意义
计数排序的思路
开辟一个大小为目标数组元素最大值+1的辅助空间
将数组元素的值作为辅助空间的下标,然后辅助空间下标对应的值+1.
即将数组元素的值作为辅助空间的下标,然后依次取出
例如: {15,6,2,9,21,6,5,1}
那么辅助空间的大小就应该是最大值21+1=22。之所以说它浪费空间,就是有很多空间是没有被用到的。
然后,当我读到15的时候,就在辅助数组下标为15的位置上+1,扫到6,就在下标为6的位置+1,一次类推。
当原数组全部扫描完后,就从左到右扫描辅助数组,依次返回辅助数组下标的数值不为0的下标回填到原数组。
二、代码实现
// 计数排序
public class Demo39 {
public static void main(String[] args) {
int[] arr = Util.RandomIntArr(20, 1, 60); // 生成20位1-60的随机数
System.out.print("排序前:");
Util.printlnArr(arr);
countSort(arr);
System.out.print("排序后:");
Util.printlnArr(arr);
}
public static void countSort(int[] arr) {
// 开辟辅助空间
int[] helper = new int[Util.getMax(arr) + 1];
int index = 0; // 扫描原数组的下标
// 记录数组元素
while (index < arr.length) {
helper[arr[index]]++; // 放入合适的位置,辅助数组下标++
index++;
}
// 扫描辅助数组
int a = 0; // 回填原数组的下标
for (int i = 0; i < helper.length; i++) {
// 将值不为0的下标依次放回原数组
while (helper[i] > 0) {
arr[a] = i;
a++;
helper[i]--;
}
}
}
}
运行结果
三、总结
下标也是可以有意义的。
动手敲,将代码实现了,灵活运用。
手上功夫很重要。