通常要排序一个数组免不了要“比较”:比较arr[i]和arr[i+1]的大小关系并判断是否交换;这里我要介绍一种不通过比较数组元素来实现排序的新思路:频率法
为了突出频率法和普通方法的区别,我将贴出普通数组排序方法和频率法两者的代码,首先是普通方法(简单的选择排序,基于Java实现)
void sort(int[] arr){ for(int i=0; i<arr.length-1; i++){ for(int j=i; j<arr.length; j++){ if(arr[i]>arr[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<arr.length; i++){ for(int j=0; i<=max(arr); j++){ if(arr[i]==j){ frqs[j]++; } } } int k=0; for(int i=0; i<frqs.length; i++){ for(int j=0; j<frqs[i]; j++){ arr[k]=i; k++; } } }
说明1:上述代码的max函数省略了,就是返回该数组的最大值
说明2:不同语言实现不同,但是思路是一样的;如Python在第二个for循环只需要一层,直接print i * frqs[i]
频率法的思路是:“占位”,即首先不管待排序数组有哪些数字,创建一个下标从0~max的数组用来存放这些数(以及这些数之间的数),用for循环遍历得到各个数字的出现频率,并把值存放在frqs数组中;巧妙之处在于,下标就是顺序,对应数组元素中存放的值就是出现次数
如果觉得《频率法:数组排序的另一种思路》对你有帮助,请点赞、收藏,并留下你的观点哦!