漫画算法22计数排序的优化

Posted 世界如此奇妙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漫画算法22计数排序的优化相关的知识,希望对你有一定的参考价值。


【漫画算法】22计数排序的优化

怎么解决这个问题呢?

很简单,只要不再以输入数列的最大值+1作为统计数组的长度,而是以数列最大值-最小值+1作为统计数组的长度即可。

同时,数列的最小值作为一个偏移量,用于计算整数在统计数组中的下标。

以刚才的数列为例,统计出数组的长度为99-90+1=10,偏移量等于数列的最小值90。

对于第1个整数95,对应的统计数组下标是95-90 = 5,如图所示。

【漫画算法】22计数排序的优化

【漫画算法】22计数排序的优化

给出一个学生成绩表,要求按成绩从低到高进行排序,如果成绩相同,则遵循原表固

【漫画算法】22计数排序的优化

有顺序。

那么,当我们填充统计数组以后,只知道有两个成绩并列为95分的同学,却不知道哪一个是小红,哪一个是小绿。

仍然以刚才的学生成绩表为例,将之前的统计数组变形成下面的样子。

【漫画算法】22计数排序的优化

这是如何变形的呢?其实就是从统计数组的第2个元素开始,每一个元素都加上前面所有元素之和。

为什么要相加呢?初次接触的读者可能会觉得莫名其妙。

这样相加的目的,是让统计数组存储的元素值,等于相应整数的最终排序位置的序号。例如下标是9的元素值为5,代表原始数列的整数9,最终的排序在第5位。

接下来,创建输出数组sortedArray,长度和输入数列一致。然后从后向前遍历输入数列。

第1步,遍历成绩表最后一行的小绿同学的成绩。

小绿的成绩是95分,找到countArray下标是5的元素,值是4,代表小绿的成绩排名位置在第4位。

同时,给countArray下标是5的元素值减1,从4变成3,代表下次再遇到95分的成绩时,最终排名是第3

【漫画算法】22计数排序的优化

第2步,遍历成绩表倒数第2行的小白同学的成绩。

小白的成绩是94分,找到countArray下标是4的元素,值是2,代表小白的成绩排名位置在第2位。

同时,给countArray下标是4的元素值减1,从2变成1,代表下次再遇到94分的成绩时(实际上已经遇不到了),最终排名是第1。

【漫画算法】22计数排序的优化

第3步,遍历成绩表倒数第3行的小红同学的成绩。

小红的成绩是95分,找到countArray下标是5的元素,值是3(最初是4,减1变成了3),代表小红的成绩排名位置在第3位。

同时,给countArray下标是5的元素值减1,从3变成2,代表下次再遇到95分的成绩时(实际上已经遇不到了),最终排名是第2。

【漫画算法】22计数排序的优化

【漫画算法】22计数排序的优化

【漫画算法】22计数排序的优化

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计数排序的优化的主要内容,如果未能解决你的问题,请参考以下文章

排序算法计数排序

漫画:什么是计数排序?

十大经典排序--计数排序及其优化

排序算法计数排序

算法计数排序 + 各个排序算法的稳定性

计数排序 - 算法数据结构面试分享