#include<stdio.h>
#include<string.h>
int main(){
char str[1024][128];
char tmp[128],tmp1[128];
int i,j,k,l,l1,m,n,s,t;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++){
scanf("%s",str[i]);
}
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
l=strlen(str[i]);
l1=strlen(str[j]);
k=l<l1?l:l1;
for(m=0;m<k;m++){
if(str[i][m]<str[j][m]){
break;
}
if(str[i][m]>str[j][m]){
strcpy(tmp,str[i]);
strcpy(str[i],str[j]);
strcpy(str[j],tmp);
break;
}
if(str[i][m]==str[j][m]&&(m+1)==k&&l>l1){
strcpy(tmp,str[i]);
strcpy(str[i],str[j]);
strcpy(str[j],tmp);
break;
}
}
}
}
for(i=0;i<n;i++){
printf("%s\n",str[i]);
}
}
return 0;
}
此代码还可以优化,如果用上面的方法strcpy调用次数过多,过于耗时,对时间有要求可以看下面也可更换排序算法。
#include<stdio.h>
#include<string.h>
int main(){
char str[1024][128];
char tmp[128],tmp1[128];
int i,j,k,l,l1,m,n,s,t;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++){
scanf("%s",str[i]);
}
for(i=0;i<n-1;i++){
strcpy(tmp,str[i]);
t=i;
for(j=i+1;j<n;j++){
l=strlen(tmp);
l1=strlen(str[j]);
k=l<l1?l:l1;
for(m=0;m<k;m++){
if(tmp[m]<str[j][m]){
break;
}
if(tmp[m]>str[j][m]){
t=j;
strcpy(tmp,str[j]);
break;
}
if(tmp[m]==str[j][m]&&(m+1)==k&&l>l1){
t=j;
strcpy(tmp,str[j]);
break;
}
}
}
if(t!=i){
strcpy(tmp1,str[i]);
strcpy(str[i],tmp);
strcpy(str[t],tmp1);
}
}
for(i=0;i<n;i++){
printf("%s\n",str[i]);
}
}
return 0;
}