清华大学考研复试机试:成绩排序

题目描述:

查找和排序

题目:

输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。

示例:

jack 70
peter 96
Tom 70
smith 67

从高到低 成绩
peter 96
jack 70
Tom 70
smith 67

从低到高

smith 67
jack 70
Tom 70
peter 96

输入描述

输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开

输出描述

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

分析

水题,定义一个结构体直接做,不用多说什么。通过这道题我们来复习一下c++的一些好用的函数,会用这些函数,可以大大增强你的实力。

首先是

#include<algorithm>

这个头文件非常好用,里面包含了丰富的泛型函数,里面的函数可以 和STL模板结合使用,也可以单独使用。头文件拼写有点复杂,注意不要写错了。

里面有一个函数sort,相信大家都很熟悉,是用来进行排序的,乍一看可以直接用于这道题。很遗憾,如果你直接用sort并不能AC。因为题目要求是稳定排序,使用sort进行排序,并不是稳定的。

我们先来讲解一下sort的使用,sort的前两个参数是排序的起始数据和结束数据的后一位,如下所示:

int* data = new int[10];
sort(data, data+10, compare);

sort前两个参数传入的是数据的地址,注意第二个参数传入的是结束数据的后一位的地址,不要传错了。然后是第三个参数,compare函数,顾名思义这是一个比较函数,决定sort的排序结果是升序还是降序,名字什么的随便取啦。一个简单典型的compare函数如下所示:

bool compare(const int& a, const int& b)
{
	return a < b;
}

什么意思呢?不要慌,我们一步一步来讲解需要注意的点。首先看参数,是两个const的引用类型,一定要这样写,这样才比较规范,返回类型是bool类型。然后我们来解释return语句的意思。上述函数的意思是让sort的结果为升序,我们可以看到返回的是a<b的真假。可以这样理解,如果a<b,则结果为真。这样也就是说在排序后的序列里面是 前一个元素的值 < 后一个元素的值,也就是升序排列啦。如果是降序,则把<号改为>号就行了。是不是很简单呢!

上面讲解了如何对内部类型进行sort排序,那么如果是用户自定义类型又该怎么使用sort呢?下面我们就以结构体为例,讲解自定义类型如何用sort进行排序,主要是compare函数的编写。代码如下所示:

typedef struct student
{
	string name;
	int grade;
}student;

bool compare(const student& a, const student& b)
{
	return a.grade < b.grade;
}

student* stu = new student[10];

sort(stu, stu+10, compare);

上述代码的意思是将student按照成绩grade的大小升序排列。是不是也很简单呢?compare函数里面就写入你想用来进行排序的指标就可以了。

好了,说了这么多,还没有说题目怎么做呢!题目要求我们进行稳定排序,而sort并不能实现稳定排序,难道要我们自己手写一个排序?其实并不用,我们依然可以调用现成的函数,那么应该怎么做呢?

有两种方法,第一种:

bool compare(const int& a, const int& b)
{
	return a <= b;
}

只需将compare函数里面改为<=就可以了,按照上面的讲解,自己理解一下,这里就不再赘述。

第二种方法:

bool compare(const int& a, const int& b)
{
	return a < b;
}

int* data = new int[10];
stable_sort(data, data+10, compare);

调用stable_sort函数,这个函数是在sort的基础上进行改进的,它的排序结果是稳定的。

注意:如果要使用stable_sort函数,最好使用支持c++14及以上版本的编译器,否则有可能不能通过编译。

最后放上AC代码:

#include<iostream>
#include<algorithm>
#include<string>

using namespace std;

typedef struct student
{
	string name;
	int grade;
}student;

bool compare0(const student& a, const student& b)
{
	return a.grade > b.grade;
}

bool compare1(const student& a, const student& b)
{
	return a.grade < b.grade;
}

int main(void)
{
	int num, method;
	while(cin >> num >> method)
	{
		student* stu = new student[num];
		for(int i = 0; i < num; ++i)
		{
			cin >> stu[i].name >> stu[i].grade;
		}
		if(method == 0)
		{
			stable_sort(stu, stu+num, compare0);
		}
		else
		{
			stable_sort(stu, stu+num, compare1);
		}
		for(int i = 0; i < num; ++i)
		{
			cout << stu[i].name << " " << stu[i].grade << endl;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值