介绍
基数排序是桶排序的进阶,如果已经掌握桶排序,(桶排序通俗易懂)那么基数排序理解起来就很简单了,这里只介绍如何使用,原理以后自会理解,就好像老师教你1+1=2,但是老师不教你1+1为什么=2😁
-
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用
-
基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法
-
基数排序(Radix Sort)是桶排序的扩展
-
基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。
基本思想
-
将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
-
这样说明,比较难理解,下面我们看一个图文解释,理解基数排序的步骤
其实看完图解自己就可以写出代码了,我就是花了差不多一个半小时写的,为什么时间那么长,是因为有一个超级小的bug没看出来,debug了好久终于发现了😅
代码
//基数排序方法
public static void radixSort(int[] arr) {
int len=arr.length;
int[][] radix = new int[10][len];//桶
int[] eleCounts= new int[10];//给每个桶中放入的数计数
//用count0表示eleCounts[0],如果所有的数都在eleCounts[0]中就退出循环
for(int i=0,n=1,count0=0;count0<len;i++,n*=10) {
//得到位数放入桶里
for(int j=0;j<len;j++) {
int ele=arr[j]/n%10;
radix[ele][eleCounts[ele]++]=arr[j];
}
count0=eleCounts[0];
//从桶中把数在放回原数组中
for(int l=0,k=0;l<10&&k<len;l++) {
int count=eleCounts[l];
while(eleCounts[l]>0) {
arr[k++]=radix[l][count-(eleCounts[l]--)];
}
}
}
}
如果有负数,就正负分开,用两次排序,再合并