字符串排序-大写后排程序

这是效果图,前面是个原字符串,随机生成,后面是排序后的字符串,将大写字母后排,保证相对位置不变。以为是代码:
#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;
}

 
 
 
 
 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值