基数排序(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 2018-07-27 16:37  会飞的金鱼  阅读(276)  评论(0)    收藏  举报