排序(3)

本文通过三个实例介绍了排序算法的应用,包括筛选最大值并排序剩余元素、按不同条件对学生成绩记录进行排序,以及对字符串中的字符进行升序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序课后练习---共3题 题目描述:

输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序。

输入:
输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。
接下来的一行有N个整数。
输出:
可能有多组测试数据,对于每组数据,
第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。
第二行将排序的结果输出。
样例输入:
4
1 3 4 2
样例输出:
4
1 2 3
提示:

如果数组中只有一个数,当第一行将其输出后,第二行请输出"-1"。

#include <stdio.h>
#include <algorithm>
using namespace std;

int arr[1000];

int main()
{
	int num;
	while(scanf("%d",&num)!=EOF){
		for(int i = 0;i < num;i++){
			scanf("%d",&arr[i]);
		}
		sort(arr,arr+num);//从小到大排序
		printf("%d\n",arr[num-1]);//输出最大的数
		if((num-1)!=0){
			//将剩余的数按照从小到的的顺序输出
			for(int i = 0;i < num-1;i++){
				printf("%d",arr[i]);
				if(i != num -2){  //注意输出格式,在输出每行的最后一个数字时,不必再输出空格,直接输出换行
					printf(" ");
				}
			}
			printf("\n");
		}else{
			printf("-1\n");
		}
	}
	return 0;
}


 

题目描述:
    Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。
    对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3
时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
输入:

    测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (N<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。

输出:
    对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3
时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
样例输入:
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
4 2
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 98
4 3
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 90
0 0
样例输出:
Case 1:
000001 Zoe 60
000007 James 85
000010 Amy 90
Case 2:
000010 Amy 90
000002 James 98
000007 James 85
000001 Zoe 60
Case 3:
000001 Zoe 60
000007 James 85
000002 James 90
000010 Amy 90
要注意两个问题:
   1)排序函数写成三个不同的方法,根据i的不同调用不同的方法-----最开始自己是把<进行了重载,在重载函数中根据不同的i执行相应的分支---这种思路很不好,而且提交后会报莫名的错误---囧--要吸取教训
   2)注意细节---在读题时,一定要注意输入输出的格式---在本题中Case j(这里的j值得是第几组输出,而不是排序时依据的i)
 
 

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;



struct Student
{
	int no;
	char name[9];
	int score;
}stu[100000];

bool cmp1(Student x,Student y){
	return x.no < y.no;
}
bool cmp2(Student x,Student y){
	if(strcmp(x.name,y.name)!=0){
		return strcmp(x.name,y.name) < 0;
	}else{
		return x.no < y.no;
	}
}
bool cmp3(Student x,Student y){
	if(x.score != y.score){
		return x.score<y.score;
	}else{
		return x.no<y.no;
	}
}

int main()
{
	int i;
	int num;
	int count = 1;
	scanf("%d%d",&num,&i);
	while(num != 0 && i !=0){
		for(int j =0;j < num;j++){
			scanf("%d%s%d",&stu[j].no,stu[j].name,&stu[j].score);
		}
		switch(i){
           case 1:sort(stu,stu+num,cmp1);break;
		   case 2:sort(stu,stu+num,cmp2);break;
		   case 3:sort(stu,stu+num,cmp3);break;
		}
		printf("Case %d:\n",count); //case后跟的应该是用例的序号而不应该是排序方式
		for(int j = 0;j<num;j++){
			printf("%06d %s %d\n",stu[j].no,stu[j].name,stu[j].score);
		}
		scanf("%d%d",&num,&i);
		count++;
	}
	return 0;
}


 

 

题目描述:

输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串。

输入:

测试数据有多组,输入字符串。

输出:

对于每组输入,输出处理后的结果。

样例输入:
bacd
样例输出:
abcd

迄今为止做的最顺利的题了----原谅我C忘得差不多了--但我会努力滴

 

 

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

bool cmp(char x,char y)
{
	return x<y;
}
int main()
{
	char str[201];
	while(scanf("%s",str)!=EOF){
		sort(str,str+strlen(str),cmp);
		printf("%s\n",str);
	}
	return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值