空间换时间的典型表明算法---计数排序

1、前言

计数排序是十大排序算法中效率最高的,由于它不须要进行比较,只要进行映射,因此效率很是的高。可是咱们学习计数排序主要的仍是要理解计数排序中运用到的核心:学会将数组的下标变得有意义web

计数排序的思路

开辟一个大小为目标数组元素最大值+1的辅助空间
将数组元素的值做为辅助空间的下标,而后辅助空间下标对应的值+1.
即将数组元素的值做为辅助空间的下标,而后依次取出算法

例如: {15,6,2,9,21,6,5,1}
那么辅助空间的大小就应该是最大值21+1=22。之因此说它浪费空间,就是有不少空间是没有被用到的。
而后,当我读到15的时候,就在辅助数组下标为15的位置上+1,扫到6,就在下标为6的位置+1,一次类推。
当原数组所有扫描完后,就从左到右扫描辅助数组,依次返回辅助数组下标的数值不为0的下标回填到原数组。数组

2、代码实现

// 计数排序
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

3、总结

下标也是能够有意义的。
动手敲,将代码实现了,灵活运用。
手上功夫很重要。svg