1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<malloc.h> using namespace std; const int maxn=1e6+7; int arr[maxn]={12,14,54,5,6,3,9,8,47,89}; int getdigit(int x,int d){ int a[]={1,1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9}; return ((x/a[d])%10); } void msdradix_sort(int begin,int end,int d){ const int radix=10; int count[radix],i,j; for(i=0;i<10;++i)count[i]=0; int *bucket=(int *)malloc((end-begin+1)*sizeof(int)); for(i=begin;i<=end;++i){ count[getdigit(arr[i], d)]++; } for(i=1;i<radix;++i){ count[i]+=count[i-1]; } for(i=end;i>=begin;--i){ j=getdigit(arr[i],d); bucket[count[j]-1]=arr[i]; --count[j]; } for(i = begin, j = 0;i <= end; ++i, ++j){ arr[i] = bucket[j]; } free(bucket); for(i=0;i<radix;i++){ int p1=begin+count[i]; int p2=begin+count[i+1]-1 ; if(p1<p2&&d>1){ msdradix_sort(p1, p2, d-1); } } } int main(){ int len=10; for(int i=0;i<10;i++)cout<<arr[i]<<" "; cout<<endl; msdradix_sort(0,10-1,2); for(int i=0;i<10;i++)cout<<arr[i]<<" "; cout<<endl; }
|
热评话题