计数排序是十大排序算法中效率最高的,由于它不须要进行比较,只要进行映射,因此效率很是的高。可是咱们学习计数排序主要的仍是要理解计数排序中运用到的核心:学会将数组的下标变得有意义web
开辟一个大小为目标数组元素最大值+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]--; } } } }
运行结果
dom
下标也是能够有意义的。
动手敲,将代码实现了,灵活运用。
手上功夫很重要。svg