计数排序:
三级版计数排序是对二级版计数排序的进一步优化,他不在对辅助数组进行双重循环扫描输入数字,而是用一种巧妙的方法对数组进行赋值。
代码思路:
略……(哈哈,我觉得我不一定准确的弄明白了,所以就不在这里误人子弟了,不过将上传一个视频链接供大家分享)
代码如下:
public class 计数排序三级版 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print("产生的随机数组如下:");
int[] arr = gennerateArry(15, 1000, 1);
for (int i : arr) {
System.out.print(i + " ");
}
System.out.print("\n三级计数排序后的数组如下:");
arr = countSort3(arr);
for (int i : arr) {
System.out.print(i + " ");
}
}
/*
* 产生数组长度为len,数组最大值可为max,数组最小值可为min的随机数组
*/
public static int[] gennerateArry(int len, int max, int min) {
int[] arr = new int[len];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * (max - min) + min);
}
return arr;
}
/*
* 三级版计数排序
*/
public static int[] countSort3(int[] arr) {
// 起初的思路、代码和二级版计数排序一样
int max = arr[0];
int min = arr[0];
for (int i : arr) {
if (i > max)
max = i;
if (i < min)
min = i;
}
int[] help = new int[max - min + 1];
for (int i : arr) {
help[i - min]++;
}
// 从这里开始进行优化
for (int i = 1; i < help.length; i++) { // 辅助数组中从第二个开始每个的下标内的数字是自己和前一个下标内的数字的和
help[i] += help[i - 1];
}
int[] newArr = new int[arr.length];
for (int i = newArr.length - 1; i >= 0; i--) { // 这里有点绕,详情可以看一段小视频,体会
newArr[help[arr[i] - min] - 1] = arr[i];
help[arr[i] - min]--;
}
return newArr;
}
}
总结:
学习计算机编程语言就是学习一种新的语言,和学习语文、英语一样,重在多用,多理解(读就不用了)加油!欧力给!