漫画算法22计数排序的优化
Posted 世界如此奇妙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漫画算法22计数排序的优化相关的知识,希望对你有一定的参考价值。
怎么解决这个问题呢?
很简单,只要不再以输入数列的最大值+1作为统计数组的长度,而是以数列最大值-最小值+1作为统计数组的长度即可。
同时,数列的最小值作为一个偏移量,用于计算整数在统计数组中的下标。
以刚才的数列为例,统计出数组的长度为99-90+1=10,偏移量等于数列的最小值90。
对于第1个整数95,对应的统计数组下标是95-90 = 5,如图所示。
给出一个学生成绩表,要求按成绩从低到高进行排序,如果成绩相同,则遵循原表固
有顺序。
那么,当我们填充统计数组以后,只知道有两个成绩并列为95分的同学,却不知道哪一个是小红,哪一个是小绿。
仍然以刚才的学生成绩表为例,将之前的统计数组变形成下面的样子。
这是如何变形的呢?其实就是从统计数组的第2个元素开始,每一个元素都加上前面所有元素之和。
为什么要相加呢?初次接触的读者可能会觉得莫名其妙。
这样相加的目的,是让统计数组存储的元素值,等于相应整数的最终排序位置的序号。例如下标是9的元素值为5,代表原始数列的整数9,最终的排序在第5位。
接下来,创建输出数组sortedArray,长度和输入数列一致。然后从后向前遍历输入数列。
第1步,遍历成绩表最后一行的小绿同学的成绩。
小绿的成绩是95分,找到countArray下标是5的元素,值是4,代表小绿的成绩排名位置在第4位。
同时,给countArray下标是5的元素值减1,从4变成3,代表下次再遇到95分的成绩时,最终排名是第3
第2步,遍历成绩表倒数第2行的小白同学的成绩。
小白的成绩是94分,找到countArray下标是4的元素,值是2,代表小白的成绩排名位置在第2位。
同时,给countArray下标是4的元素值减1,从2变成1,代表下次再遇到94分的成绩时(实际上已经遇不到了),最终排名是第1。
第3步,遍历成绩表倒数第3行的小红同学的成绩。
小红的成绩是95分,找到countArray下标是5的元素,值是3(最初是4,减1变成了3),代表小红的成绩排名位置在第3位。
同时,给countArray下标是5的元素值减1,从3变成2,代表下次再遇到95分的成绩时(实际上已经遇不到了),最终排名是第2。
1. public static int[] countSort(int[] array) {
2. //1.得到数列的最大值和最小值,并算出差值d
3. int max = array[0];
4. int min = array[0];
5. for(int i=1; i<array.length; i++) {
6. if(array[i] > max) {
7. max = array[i];
8. }
9. if(array[i] < min) {
10. min = array[i];
11. }
12. }
13. int d = max - min;
14. //2.创建统计数组并统计对应元素的个数
15. int[] countArray = new int[d+1];
16. for(int i=0; i<array.length; i++) {
17. countArray[array[i]-min]++;
18. }
19.
20. //3.统计数组做变形,后面的元素等于前面的元素之和
21. for(int i=1;i<countArray.length;i++) {
22.
23. countArray[i] += countArray[i-1];
24. }
25. //4.倒序遍历原始数列,从统计数组找到正确位置,输出到结果数组
26. int[] sortedArray = new int[array.length];
27. for(int i=array.length-1;i>=0;i--) {
28. sortedArray[countArray[array[i]-min]-1]=array[i];
29. countArray[array[i]-min]--;
30. }
31. return sortedArray;
32. }
33.
34. public static void main(String[] args) {
35. int[] array = new int[] {95,94,91,98,99,90,99,93,91,92};
36. int[] sortedArray = countSort(array);
37. System.out.println(Arrays.toString(sortedArray));
38. }
以上是关于漫画算法22计数排序的优化的主要内容,如果未能解决你的问题,请参考以下文章