这是效果图,前面是个原字符串,随机生成,后面是排序后的字符串,将大写字母后排,保证相对位置不变。以为是代码:
#include"test_char_exchange.h"
#include<stdlib.h>
#include<stdio.h>
int isup(char c)
{return c>='A'&&c<='Z'?1:0;}
void swap(char *c1,char *c2)
{int t=*c1;*c1=*c2;*c2=t;}
int exchange(char*cs,int f,int r)//返回大写字母个数
{
if(f==r)return isup(cs[f]);
int m=(f+r)/2;
int k1=exchange(cs,f,m);//前半部分排序
int k2=exchange(cs,m+1,r);//后半部分排序
if(k1>0&&k2<r-m)//如果前半部分有大写字符串或者后半部分有小写字符串,则两者交换位置
{
int b=m-k1+1;//交换起始点
int e=r-k2;//交换终点
while(e-m!=m-b+1)//如果需要交换的两字符串长度不相等,则循环交换使相等
{
while(e-m>m-b+1&&m>=b)//如果后半部分字符串更长
{
int temp=m;//记下前半部分字符串的终点
while(m>=b)swap(&cs[m--],&cs[e--]);//将cs[b:m]部分交换到cs[……:e]
m=temp;//恢复前半部分终点
}
while(e-m<m-b+1&&m>=b)//如果后半部分更短
swap(&cs[m--],&cs[e--]);//将后半部分字符串交换到前半部分的末端
}
while(m>=b)swap(&cs[m--],&cs[e--]);//两字符串长度相等,可以依次交换
}
return k1+k2;
}
#define MLEN 1024
int test()
{
char cs[MLEN+1]="";
for(int k=0;k<1;k++)
{
for(int j=0;j<MLEN;j++)
{
int m=rand()%100;
if(m>50)
cs[j]=m%25+'a';
else
cs[j]=m%25+'A';
}
printf("\n %s \n",cs);
exchange(cs,0,MLEN-1);
int p=0,q=MLEN-1;
while((!isup(cs[p]))&&p<MLEN)p++;
while(isup(cs[q])&&q>=0)q--;
if(p-q!=1)return 0;
printf("\n %s \n",cs);
}
return 1;
}