这个题的排序相比之前的会有点麻烦,第一个是需要字母从小到大,第二个字母相同位置不变,第三个是其他字符位置不动,那么其实这里的话可以使用一个桶排序,先将这写字母按照顺序放好,判断当前字符串的位置将其放进去即可。其实应该也算是稳定排序的一种,后面可以试下能不能用冒泡排序去做
#include<stdio.h> #include<string.h> char str[1005]; struct postion{ char ch[105]; int length; }pos[27]; int main(){ while(fgets(str,1005,stdin)!=NULL){ for(int i=0;i<27;i++){ memset(pos[i].ch,0,sizeof(pos[i].ch)); pos[i].length=0; } //每个字母遍历放在桶里面 for(int i=0;str[i]!=0;i++){ if(str[i]>='a'&&str[i]<='z'){ pos[str[i]-'a'].ch[pos[str[i]-'a'].length++]=str[i]; str[i]='a'; }else if(str[i]>='A'&&str[i]<='Z'){ pos[str[i]-'A'].ch[pos[str[i]-'A'].length++]=str[i]; str[i]='a'; } } int x=0,y=0; //处理桶的数据,放在str里面 for(int i=0;str[i]!=0;){ if(str[i]=='a'){ while(pos[x].length==0){ x++; } str[i]=pos[x].ch[y]; y++; i++; if(y==pos[x].length){ y=0; pos[x].length=0; } }else{ i++; } } fputs(str,stdout); } return 0; }