基数排序模板

用Tyvj上的快速排序测试了一下,1s AC,数据貌似比较水,前4个点都是1000个数以下(别问我怎么试出来的)

时间复杂度据说是O(nm),貌似还不错

代码实现

package radixSort;

import java.util.Scanner;

public class radixSort {
    static int N=10000;
    public void print(int[] a,int n){
        for(int i=0;i<=n;i++)
            System.out.print(a[i]+" ");
        /*for(int i=n;i>=0;i--) System.out.print(a[i]+" ");*/
    }
    public int getNum(int x,int t){
        for(int i=1;i<t;i++)
            x/=10;
        return x%10;
    }
    public void radixSort(int[] a,int begin,int end,int maxBit){
        int[] cnt=new int[10];
        int[] buc=new int[end-begin+1];
        for(int d=1;d<=maxBit;d++){
            for(int i=0;i<10;i++)
                cnt[i]=0;
            for(int i=begin;i<=end;i++)
                cnt[getNum(a[i],d)]++;
            for(int i=1;i<10;i++)
                cnt[i]+=cnt[i-1];
            for(int i=end;i>=begin;i--)
                buc[--cnt[getNum(a[i],d)]]=a[i];
            for(int i=0;i<=end;i++)
                a[i+begin]=buc[i];
        }
    }
    public int[] sort(int[] a,int n){
        int maxBit=0;
        for(int i=0;i<=n;i++){
            int cnt=0,val=a[i];
            while(val>0){
                cnt++;
                val/=10;
            }
            maxBit=Math.max(maxBit,cnt);
        }
        radixSort(a,0,n,maxBit);
        return a;
    }
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        int[] a=new int[N];
        int n=in.nextInt();
        for(int i=0;i<n;i++)
            a[i]=in.nextInt();
        radixSort radix =new radixSort();
        radix.sort(a,n-1);
        radix.print(a,n-1);
    }
}

小伙伴们交的时候记得改一下

public class Main

不然会CE的很惨 T_T

还有这题要求是从大到小一行输出,看看注释掉的代码段就知道了

By YOUSIKI

你可能感兴趣的:(基数排序模板)