假设我们需要对一个整数类型的数组进行排序,那么排序的方法有很多种(归并排序啊、快速排序等等),今天主要是讲一下刚学习的计数排序。
假设有下面这样一个数组:
我们要对这样的一个数组进行计数排序,计数计数,那么就是记录每一个数字出现的次数,就这么简单!!!
1. 思路分析
① 首先遍历上面数组,找到它的最小值(min)以及最大值(max);
② 再创建一个数组,数组长度为 max - min + 1,用来记录原数组中数字出现的次数;
count(number) 代表原数组中 number 出现的次数。
③ 统计出每个数字出现次数,那么我们可以从小到大把数字放回原数组。
比如最小值为9,统计出来它出现了3次,那么我们首先就把9这个数字放入原数组的0-2索引。第二小的数字为11,出现的次数为2,那么我们就把11放入原数组的3-4索引。
而中间的数字10一次都没有出现,说明原数组中也没有该数字,所以可以直接跳过。
放回原数组的思想就是这么个思想。
2. 子功能方法体
好了,思路分析完了,那么我们就来写代码实现吧!
(1)初始化数组长度
//设置数组长度
public static void setArrayLength() {
System.out.println("请输入数组长度:");
Scanner sc = new Scanner(System.in);
int length = sc.nextInt();
while (length <= 1) {
if (length < 0) {
System.out.println("数组长度为负,不合法!");
}
if (length == 0) {
System.out.println("数组长度为0,没有元素!");
}
if (length == 1) {
System.out.println("数组长度为1,不用排序!");
}
System.out.println("请重新输入数组长度:");
length = sc.nextInt();
}
array = new int[length];
}
(2)设置原数组中每个索引处数值,在设置的同时进行最大值最小值判断
自动随机或者手动设置,用到了Random类和Scanner类
//输入两个值,left、right,数组的值的范围为 [left, right)
//范围内的值随机赋给数组
public static void autoSetArrayValue() {
int value;
Random r = new Random();
System.out.println("请你想随机数产生的区间[left, right),注意是左闭右开区间!");
Scanner sc = new Scanner(System.in);
System.out.println("请输入左边阈值:");
int left = sc.nextInt()