基数排序不是比较排序,因此不受比较排序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(); }