基数排序(Radix Sort)是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(k*n),n为数组长度,k为数组中的最大数的位数。基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级的在前,高优先级相同的,比较次优先级。基数排序不能对负数排序。
算法描述:
1,取得数组中的最大值元素,并取得该值的位数。
2,将待排序的序列,从最低位开始将对应位上的元素放置在对应桶里。
3,将桶里的数据合并之后,重新赋给待排序的序列。再重复2的动作,进行下一次排序。
动图演示:

代码实现:
public class Sort{ public static void printArr(int[] arr){ for(int i:arr){ System.out.print(i+" "); } } @SuppressWarnings("unchecked") public static void radixSort(int[] arr){ if(arr==null||arr.length==0){ return; } //数组中元素的个数 int len=arr.length; //找出数组中最大值 int max=Integer.MIN_VALUE; for(int i:arr){ if(max<i){ max=i; } } //计算最大值对应的位数 int maxDigit=(int)Math.log10(max)+1; List<ArrayList<Integer>> list=new ArrayList<>(10); for(int i=0;i<10;i++){ list.add(new ArrayList()); } //base表示基数,k表示对应的位数 int base=1,k=1; int num; while(k<=maxDigit){ for(int i=0;i<len;i++){ //计算数组中元素对应的桶,并将该元素放置该桶里 num=(arr[i]/base)%10; list.get(num).add(arr[i]); } base*=10; k++; //数组元素下标 int j=0; //将桶里元素重新赋值给数组 for(ArrayList arrList:list){ for(int i=0;i<arrList.size();i++){ arr[j++]=(Integer)arrList.get(i); } //清空桶里元素 arrList.clear(); } } } public static void main(String[] args){ int[] arr=new int[]{3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}; radixSort(arr); printArr(arr); } }
posted on
浙公网安备 33010602011771号