sort排序和cmp函数以及字典序的应用

今天做了一道排序的题,用了sort排序,而对附属语句cmp函数的使用不熟悉

下面是一道题

生日(快乐暑假)

总时间限制: 

1000ms

内存限制: 

65536kB

描述

小明想要调查学校每个同学的生日,并按照年龄从大到小的顺序排列,但是小明最近的作业很多,没有时间,所以请你帮他排序。

输入

第1行:学校学生的总人数n
第2行至第n+1行:每一行分别是每位学生的姓名s,出生年y,月m,日d,中间用空格隔开。(姓名s中不包含空格)

输出

有n行:即n个按照年龄从大到小的顺序排列的学生姓名。(如果有两个学生的生日相同,先输出s较短的同学;若s的长度相同,则按照姓名的字典序从小到大输出;)

样例输入

3
Yangchu 2006 04 03
Qiujingya 2007 10 13
Luowen 2005 08 01

样例输出

Luowen
Yangchu
Qiujingya

提示

【数据规模】
2<=n<=10000;Length(s)<=20;

以及个人代码

先前是用冒泡排序

然而超时了

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct node{
	char a[25];
	int b;
	int c;
	int d;
}m[10005];
int main()
{
	int n,i,j,k;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%s %d%d%d",m[i].a,&m[i].b,&m[i].c,&m[i].d);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n-1;j++)
		{
			if(m[j].b>m[j+1].b)
				swap(m[j],m[j+1]);
			else if(m[j].b==m[j+1].b&&m[j].c>m[j+1].c)
				swap(m[j],m[j+1]);
			else if(m[j].b==m[j+1].b&&m[j].c==m[j+1].c&&m[j].d>m[j+1].d)
				swap(m[j],m[j+1]);
			else if(m[j].b==m[j+1].b&&m[j].c==m[j+1].c&&m[j].d==m[j+1].d)
				for(k=0;k<=strlen(m[j].a);k++)
					if(m[j].a[k]>m[j+1].a[k])
					{
						swap(m[j],m[j+1]);
						break;
					}
					else if(m[j].a[k]<m[j+1].a[k])
						break;
		}
	}
	for(i=1;i<n;i++)
		puts(m[i].a);
	printf("%s",m[n].a);
}

 所以改用了sort+cmp函数

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
	char a[25];
	int b;
	int c;
	int d;
}m[10005];
bool cmp(node x,node y)
{
	return x.b<y.b;
	if(x.b==y.b)
		return x.c<y.c;
	else if(x.b==y.b&&x.c==y.c)
		return x.d<y.d;
	else if(x.b==y.b&&x.c==y.c&&x.d==y.d)
		for(int k=0;k<=strlen(x.a);k++)
			return x.a[k]<y.a[k];
	else
		return 0;
}
int main()
{
	int n,i,j,k;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%s %d%d%d",m[i].a,&m[i].b,&m[i].c,&m[i].d);
	sort(m+1,m+n+1,cmp);
	for(i=1;i<n;i++)
		puts(m[i].a);
	printf("%s",m[n].a);
}

猜你喜欢

转载自blog.csdn.net/qq_41741449/article/details/85320800
今日推荐