排序的小运用

一、 有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(不要求保持原顺序)

/*  有一个由大小写组成的字符串,现在需要对他进行修改,
 将其中的所有小写字母排在大写字母的前面
 (不要求保持原顺序) */
#include <stdio.h>
#include <string.h>

int partion(char *a,int left,int right)
{
	char num = a[right];
	
	while(left < right)
	{
		while(a[left]<='z' && a[left]>='a' && left < right)
		{
			left++;
		}
		if(left < right)
		{
			a[right] = a[left];
			right--;
		}
		while(a[right]<='Z' && a[right]>='A' && left < right)
		{
			right--;
		}
		if(left < right)
		{
			a[left] = a[right];
			left++;
		}
	}
	a[left] = num;
	
	return left;
}

void Small(char *a,int left,int right)
{
	if(left < right)
	{
		int i = partion(a,left,right);
		Small(a,left,i-1);
		Small(a,i+1,right);
	}
}

int main()
{
	char a[] = "SAadDfasAdSa";
	int len = strlen(a);
	
	printf("%s\n",a);
	
	Small(a,0,len-1);
	
	printf("%s\n",a);
	
	return 0;
}

二、最小的k个数,输入n个整数,找出其中最下的k个数

例如输入4、5、1、6、2、7、3、8、1、2,
输出最下的4个数,则输出1、1、2、2

/* 最小的k个数,输入n个整数,找出其中最下的k个数,
例如输入4、5、1、6、2、7、3、8、1、2,
输出最下的4个数,则输出1、1、2、2
 */
#include <stdio.h>

void myPrint(int *a,int k)
{
	int i;
	if(k <= 0)
		return;
	printf("%d",a[0]);
	for(i = 1;i < k;i++)
	{
		printf("%4d",a[i]);
	}
	printf("\n");
}

int partion(int *a,int left,int right)
{
	int num = a[right];			//以数组最后一位为基数
	
	while(left < right)
	{
		while(a[left] <= num && left < right)
		{
			left++;
		}
		if(left < right)
		{
			a[right] = a[left];
			right--;
		}
		while(a[right] >= num && left < right)
		{
			right--;
		}
		if(left < right)
		{
			a[left] = a[right];
			left++;
		}
	}
	a[left] = num;
	
	return left;
}

void mySort(int *a,int left,int right)
{
	if(left < right)
	{
		int data = partion(a,left,right);
		mySort(a,left,data-1);
		mySort(a,data+1,right);

	}
}

int main()
{
	int a[] = {1,4,8,2,6,8,3,24,2,3,4,5,3,3,4};
	int len = sizeof(a)/sizeof(int);
	int k;
	printf("请输入要找的最下数的个数为:");
	scanf("%d",&k);
	
	if(k <= len)
	{
		mySort(a,0,len-1);
		myPrint(a,k);
	}
	else
		printf("超过数组长度不存在\n");
	
	return 0;
}

三、判断数组中出现超过一半的数字

#include <stdio.h>
#include <stdlib.h>

struct Data
{
	int k;  //用于记录超过一半的数据的下标
	int count;//用于记录超过一半的数据的个数
};

void myPrint(int *a,int len)
{
	int i;
	for(i = 0;i < len;i++)
	{
		printf("%4d",a[i]);
	}
	printf("\n");
}

int partion(int *a,int left,int right,int len,struct Data *data)
{	
	int count = 1;
	int num = a[right];
	while(left < right)
	{
		while(a[left] < num && left < right)
		{
			left++;
		}
		if(left < right)
		{
			a[right] = a[left];
			right--;
			if(a[left] == num)
				count++;
		}
		while(a[right] > num && left < right)
		{
			right--;
		}
		if(left < right)
		{
			a[left] = a[right];
			left++;
			if(a[right] = num)
				count++;
		}
	}
	a[left] = num;
	
	if(count > len)
	{
		//printf("有超过一半的数,有%d个%d\n",count,a[left]);
		data->k = left;				//记录下标
		data->count = count;		//记录个数
		
	}
	
	return left;
}

void mySort(int *a,int left,int right,int len,struct Data *data)
{
	if(left < right)
	{
		int pivotIndex = partion(a,left,right,len,data);
		mySort(a,left,pivotIndex-1,len,data);
		mySort(a,pivotIndex+1,right,len,data);
	}
}


int main()
{
	int a[] = {1,1,3,1,3,3,3,3,3,3,6,6,5,3,4,5,3,34,3,3,8};
	int len = sizeof(a)/sizeof(int);
	struct Data *data = (struct Data *)malloc(sizeof(struct Data));

	mySort(a,0,len-1,len/2,data);
	myPrint(a,len);
	if(data->k < 0)
	{
		printf("没有超过一半的数\n");
	}
	else
	{
		printf("有超过一半的数:%d,并且共有%d个\n",a[data->k],data->count);
	}
	
	return 0;
}

四、要求将下列名单随机分组:分组要求,随机选择4个人组成一组

输出结果:4个人一行进行输出,每行代表一个组

#include <stdio.h>
#include <string.h>
#include<stdlib.h>

void swap(char (*a)[10],int i,int j)
{
	char tmp[10];
	strcpy(tmp,a[i]);
	strcpy(a[i],a[j]);
	strcpy(a[j],tmp);
}

//按字符从小到大排序
void myPrint(char(*a)[10],int len)
{
	int i;
	for(i = 0;i < len;i++)
	{
		printf("%s\t",a[i]);
		if(0 == (i+1)%4)
			printf("\n");
	}
	printf("\n");
}

void mySort(char (*a)[10],int len)					//选择排序,按字符串的大小比的
{
	int i,j;
	for(i = 0;i < len;i++)
	{
		int min = i;
		for(j = i+1;j < len;j++)
		{
			if(strcmp(a[j],a[min]) < 0)
			{
				min = j;
			}
		}
		if(min != i)
		{
			swap(a,i,min);
		}
	}
}

//随机选出4个人一组
void Rank(char (*a)[10],int len)
{	
	srand(time(NULL));
	int tmp = rand()%len;
	
	int i;
	for(i = 0;i < len;i++)
	{
		if(tmp < len)
			swap(a,i,tmp);
	}
}

int main()
{
	char a[][10] = {"曾从威","蒋恺均","刘江涛","崔雅倩","祝秋培","吴赟鹏","李鸿飞","王  虎","缪  峰"\
,"张  龙","刘加封","姚  笛","郑  丹","孔海宇","陈逸伦","徐煜清","陈  喆","盛  开","方文倩","边金鹏"\
,"陈振宇","陶小康","孙凌霄","王玉恒","王娇娇","许新华","胡光兴","周  波","王  鹏","李鸿飞","陈  程"\
,"徐小蕤","李 峰","王  琦","陈梦玉","陈志辉","李  森","陈  芳"};
	//char a[][10] = {"曾从威","蒋恺均","刘江涛","崔雅倩","祝秋培","吴赟鹏","李鸿飞"};
	//char a[][10]= {"曾","刘"};
	int len = sizeof(a)/sizeof(a[7]);
	
	//printf("%d\n",len);
	//mySort(a,len);
	Rank(a,len);
	myPrint(a,len);
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值