0
点赞
收藏
分享

微信扫一扫

《算法笔记》4.1小节——算法初步->排序

孟佳 2022-04-26 阅读 57
c++

4.1小节——算法初步->排序

A题 排序

题目描述

对输入的n个数进行排序并输出。

输入

输入的第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。

输出

可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。
每组测试数据的结果占一行。

样例输入

5
5 4 3 1 2

样例输出

1 2 3 4 5 

代码

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

vector<int> A;

int main()
{
	int n=0,temp;
	while(scanf("%d",&n)!=EOF)
	{
		for (int i=0;i<n;i++)
		{
			scanf("%d",&temp);
			A.push_back(temp);
		}
		sort(A.begin(),A.end());
		for (int i=0;i<n;i++)
		{
			printf("%d",A[i]);
			if (i!=n-1)
			    printf(" ");
			else
			    printf("\n");
		}
		A.clear();
	}
	return 0;
}

Tips

vector存储+sort排序

B题 特殊排序

题目描述

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

输入

输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。
接下来的一行有N个整数。

输出

可能有多组测试数据,对于每组数据,
第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。
第二行将排序的结果输出。

样例输入

5
5 3 2 4 1

样例输出

5
1 2 3 4

代码

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

vector<int> A;

int main()
{
	int n,i,temp;
	while(scanf("%d",&n)!=EOF)
	{
		for (i=0;i<n;i++)
		{
			scanf("%d",&temp);
			A.push_back(temp);
		}
		if (n==1)
		{
			printf("%d\n-1\n",temp);A.clear();continue;
		}
		else
		{
			sort(A.begin(),A.end());
			printf("%d\n",A[A.size()-1]);
			for (i=0;i<n-1;i++)
			{
				printf("%d",A[i]);
				if (i!=n-2)
				    printf(" ");
				else
				    printf("\n");
			}
			A.clear();
		}
	}
	return 0;
}

Tips

千万不要忘了clear()

C题 EXCEL排序

题目描述

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 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。

样例输入

4 1
000001 Zhao 75
000004 Qian 88
000003 Li 64
000002 Sun 90
4 2
000005 Zhao 95
000011 Zhao 75
000007 Qian 68
000006 Sun 85
4 3
000002 Qian 88
000015 Li 95
000012 Zhao 70
000009 Sun 95
0 3

样例输出

Case 1:
000001 Zhao 75
000002 Sun 90
000003 Li 64
000004 Qian 88
Case 2:
000007 Qian 68
000006 Sun 85
000005 Zhao 95
000011 Zhao 75
Case 3:
000012 Zhao 70
000002 Qian 88
000009 Sun 95
000015 Li 95

代码

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

int flag=0;

struct stu
{
	int num;
	char name[9];
	int grade;
};

bool cmp(stu x,stu y)
{
	if (flag==1)
	    return (x.num<y.num);
	else if(flag==2)
	{
		if (strcmp(x.name,y.name)!=0)
		    return (strcmp(x.name,y.name)<0);
		else
		    return (x.num<y.num);
	}
	else
	{
		if (x.grade!=y.grade)
		    return (x.grade<y.grade);
		else
		    return (x.num<y.num);
	}
}

vector<stu> A;

int main()
{
	int n,i,count=0;
	stu temp;
	while(scanf("%d %d",&n,&flag)!=EOF)
	{
		if (n==0)
		    break;
		printf("Case %d:\n",count+1);
		for (i=0;i<n;i++)
		{
			scanf("%d %s %d",&temp.num,&temp.name,&temp.grade);
			A.push_back(temp);
		}
		sort(A.begin(),A.end(),cmp);
		for (i=0;i<n;i++)
		{
			printf("%06d %s %d\n",A[i].num,&A[i].name,A[i].grade);
		}
		count++;
		A.clear();
	}
	return 0;
}

Tips

按照不同标准结构体排序

D题 字符串内排序

题目描述

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

输入

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

输出

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

样例输入

tianqin

样例输出

aiinnqt

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

char A[201];

int main()
{
	int n,i;
	memset(A,'\0',sizeof(A));
	while(scanf("%[^\n]",&A)!=EOF)
	{
		n=strlen(A);
		sort(A,A+n);
		printf("%s\n",A);
		getchar();
	}
	return 0;
}

Tips

sort函数的使用,其中别忘了设置n=strlen(A)

举报

相关推荐

0 条评论