基数排序(MSD)

基数排序不是比较排序,因此不受比较排序O(nlogn)的时间下限限制。

#include<iostream>
#include<cmath>
using namespace std;
int maxbit(int data[],int left,int right){
    int d=1;
    int p=10;
    for(int i=left;i<=right;i++){
        while(data[i]>=p){
            p*=10;
            d++;
        }
    }
    return d;
}
void radixsort(int data[],int left,int right,int d){
    int *tmp=new int[right-left+1];
    int count[10];
    int i,j,k;
    for(i=0;i<10;i++) count[i]=0;
    int radix;
    radix=pow(10,d-1);
    for(j=left;j<=right;j++){
        k=(data[j]/radix)%10;
        count[k]++;
    }
    for(j=1;j<10;j++) count[j]=count[j-1]+count[j];
    for(j=right;j>=left;j--){
        k=(data[j]/radix)%10;
        tmp[count[k]-1]=data[j];
        count[k]--;
    }
    for(j=left,i=0;j<=right;j++,i++) data[j]=tmp[i];
    delete[]tmp;
    for(i=0;i<10;i++){
        int l=left+count[i];
        int r=left+count[i+1]-1;
        if(l<r&&d>1){
            radixsort(data,l,r,d-1);
        }
    }
}
int main(){
    int n;cin>>n;
    int *data=new int[n];
    for(int i=0;i<n;i++) cin>>data[i];
    int d=maxbit(data,0,n-1);
    radixsort(data,0,n-1,d);
    for(int i=0;i<n;i++) cout<<data[i]<<" ";
    cin.get();
}


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