给定一组数据,对其进行基数升序排序。
给定一组数据,对其进行基数升序排序。
测试次数t
每组测试数据一行:数字个数n,后跟n个数字(整数)
对每组测试数据,输出每趟分配、收集的结果。若分配中该位没有数字,输出NULL。具体输出格式见样例。每组测试数据间以空行分隔。
#include<iostream> #include<queue> using namespace std; #define Radix 10 int keysize; void printindex(queue<int>b[Radix]) { queue<int>B[Radix]; for(int i=0;i<Radix;i++) B[i]=b[i]; for(int i=0;i<Radix;i++) { cout<<i<<":"; if(B[i].empty()) { cout<<"NULL"<<endl; } else { cout<<"->"; while(!B[i].empty()) { cout<<B[i].front()<<"->"; B[i].pop(); } cout<<"^"<<endl; } } } void printa(int *a,int n) { for(int i=0;i<n;i++) { if(i!=n-1) cout<<a[i]<<" "; else cout<<a[i]<<endl; } } int main() { int T; cin>>T; while(T--) { keysize=0; int n; cin>>n; int *a=new int[n]; for(int i=0;i<n;i++) cin>>a[i]; int maxx=a[0]; for(int i=0;i<n;i++) { if(a[i]>maxx) maxx=a[i]; } while(maxx!=0) { keysize++; maxx/=10; } queue<int>B[Radix]; int count=0; int div=1; while(count<keysize) { for(int i=0;i<n;i++) { int s=(a[i]/div)%10; B[s].push(a[i]); } printindex(B); int k=0; for(int j=0;j<Radix;j++) { while(!B[j].empty()) { a[k]=B[j].front(); B[j].pop(); k++; } } count++; div*=10; printa(a,n); } delete []a; if(T) cout<<endl; } return 0; }
原文:https://www.cnblogs.com/SZU-DS-wys/p/12183133.html