通常要排序一个数组免不了要“比较”:比较arr[i]和arr[i+1]的大小关系并判断是否交换;这里我要介绍一种不通过比较数组元素来实现排序的新思路:频率法
为了突出频率法和普通方法的区别,我将贴出普通数组排序方法和频率法两者的代码,首先是普通方法(简单的选择排序,基于Java实现)void sort(int[] arr){ for(int i=0; iarr[j]){ int tmp=arr[i]; arr[i]=arr[j]; arr[j]=tmp; } } } }
很简单的代码,现在是见证奇迹的时刻——频率法不需要比较arr[i]和arr[i+1]:
void sort(int[] arr){ int[] frqs=new int[max(arr)+1]; for(int i=0; i
说明1:上述代码的max函数省略了,就是返回该数组的最大值
说明2:不同语言实现不同,但是思路是一样的;如Python在第二个for循环只需要一层,直接print i * frqs[i]频率法的思路是:“占位”,即首先不管待排序数组有哪些数字,创建一个下标从0~max的数组用来存放这些数(以及这些数之间的数),用for循环遍历得到各个数字的出现频率,并把值存放在frqs数组中;巧妙之处在于,下标就是顺序,对应数组元素中存放的值就是出现次数