#include<stdio.h>
//初始化
Inita(int a[][10],int n){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<10;j++){
a[i][j]=0;
}
}
}
//n位数的各位数求取
int yxj(int b[],int x,int i){
int j,t=1;//t是为了确定是几位数
if(x==1){//个位
return b[i]%10;
}else if(x==2){//十位
return b[i]/10%10;
}else if(x>=3){
//百位以上
for(j=1;j<x;j++)
t*=10;
if(b[i]/t!=0)
return b[i]/t;
}
}
//一维数组b赋给二维数组a
b_a(int a[][10],int b[],int n,int x,int i){
int j=0;
while(j<n){
if(a[j][yxj(b,x,i)]==0){
a[j][yxj(b,x,i)]=b[i];//把一维数组b 赋给二维数组a
j=n;//为了跳出循环
}else{
j++;
}
}
}
//二维数组a赋给一维数组b
a_b(int a[][10],int b[],int n){
int i,j,k=0;
for(j=0;j<10;j++){//控制数组a的列
for(i=0;i<n;i++){//控制数组a的行
if(a[i][j]!=0){
b[k++]=a[i][j];//把二维数组a赋给一维数组b
}
}
}
//输出数组b
for(i=0;i<n;i++)
printf("%d ",b[i]);
printf("\n");
}
//排序
radix_sort(int a[][10],int b[],int n,int x){
int i,j,t=x;//t是后面为了判断是否x是否有没有变化,相当于是监督元
if(x!=0){
//把b赋给a
for(i=0;i<n;i++){
b_a(a,b,n,x,i);
}
//把a赋给b
a_b(a,b,n);
Inita(a,n);
//这个为了知道,每次排完序之后,是否完全顺序,是则x不变,反之则x+1
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(b[i]>b[j]){
x++;
i=n;
j=n;
}
}
}
//看是否符合条件,来判断是否进行递归,符合进行递归,不符合不进行递归。
if(t!=x)
radix_sort(a,b,n,x);
else
x=0;
}
}
int main(){
int n,x=1;
scanf("%d",&n);
int a[n][10];//存储排序数组(模仿桶)
Inita(a,n);
int i,b[n];
for(i=0;i<n;i++)
scanf("%d",&b[i]);
radix_sort(a,b,n,x);
}