《編程思維與實(shí)踐》1029.字符排序
題目

思路
桶排序的思想,考慮到調(diào)用qsort進(jìn)行排序時是直接移動指針,那么數(shù)組中非字母字符的相對位置其實(shí)會發(fā)生改變,那就不能連帶著非字母字符一起排,故可以考慮將去除大寫字母和空格的字符串存在一個數(shù)組(桶)里并排好序, 同時再記錄哪個位置存儲著非字母(包括空格),輸出時判斷該位置是否為非字母即可.
代碼
int?cmp(const?void?*a,const?void?*b)??????//qsort是會直接將指針移到后面,那么非字符的相對位置就也會發(fā)生變化?
{
????char?*m=(char*)a;
????char?*n=(char*)b;
????return?*m-*n;?
}
int?main()
{
????int?T;
????scanf("%d",&T);
????getchar();
????for(int?i=0;i<T;i++)
????{
????????char?s[201];???//讀取字符串
????????char?s1[201];???//去除非大寫字母和空格
????????int?pos[201]={0};??//記錄存儲位置哪里為非字母????非字母地方記為1
????????gets(s);
????????int?k=0,r=0;
????????for(int?j=0;j<strlen(s);j++)??
????????{
????????????if(s[j]>='A'&&s[j]<='Z')
????????????{
????????????????s1[k]=s[j];???
????????????????k++;
????????????}
????????????else
????????????{
????????????????pos[j]=1;
????????????}
????????}
????????s1[k]='\0';
????????qsort(s1,strlen(s1),sizeof(char),cmp);
????????printf("case?#%d:\n",i);
????????int?temp=0;
????????for(int?j=0;j<strlen(s);j++)
????????{
????????????if(pos[j]==1)
????????????{
????????????????printf("%c",s[j]);
????????????}
????????????else{
????????????????printf("%c",s1[temp]);
????????????????temp++;
????????????}
????????}
????????printf("\n");
????}
????return?0;
}