C++中sort()函数强大功能

最近在刷王道考研机试指南(机试小白),惊奇的发现 sort() 函数功能不是简单排个序。

sort()函数原型:

1
2
3
4
sort(start,end,cmp);
// start表示要排序数组的起始地址
// end表示数组结束地址的下一位
// cmp用于规定排序的方法,可不填,默认升序

sort() 函数包含在头文件为 #include <algorithm> 的 c++ 标准库中

一般我就使用两个参数的,第三个参数默认从小到大排序。例如对数组 a[n] 排序:sort(a,a+n);

sort() 函数的强大之处是在它的第三个参数排序方法,可以任意的设定自己的规则,使排序对象按照自己指定的规则进行排序

cmp 函数定义规则:当 cmp 的返回值为 true 时,即表示 cmp 函数的第一个参数将会排在第二个参数之前,反之,第一个参数将会排在第二个参数之后。

例 2.2 成绩排序:有 N 个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。

输入:测试数据有多组,每组输入第- 行有一个整数 N (N<=1000) ,接下来的N行包括N个学生的数据。每个学生的数据包括姓名(长度不超过 100 的字符串)、年龄(整型数)、成绩(小于等于 100 的正数)。

输出:将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。然后输出学生信息,按照如下格式:姓名 年龄 成绩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# include<bits/stdc++.h> // 万能头文件
using namespace std;
class Stu{
public:
char name[100];
int age;
int grade;
};
bool cmp(Stu a,Stu b){
if(a.grade!=b.grade)
return a.grade<b.grade; // 分数不一样
int tmp = strcmp(a.name,b.name); // 以下分数相同
if(tmp!=0) return tmp<0; // 姓名字母序不同
else return a.age<b.age; // 姓名字母序相同、年龄不同

}
int main() {
int n;
cin>>n;
Stu s[n];
for(int i=0;i<n;i++)
cin>>s[i].name>>s[i].age>>s[i].grade;
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
cout<<s[i].name<<" "<<s[i].age<<" "<<s[i].grade<<endl;
return 0;
}
文章作者: gzwang
文章链接: https://gzwangu.github.io/2020/08/01/C-中sort-函数强大功能/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Gzwang's Blog