排序模板sort
包含在头文件#include<algorithm>
使用命名空间:using namespace std;
函数:sort(a,a+n)
,其中a是起始位置,a+n是结束地址。默认是正序排序(即从小到大排序)
若想逆序排序,则需要重新定义运算规则:sort(a,a+n,cmp)
其中cmp函数定义:
bool cmp(int a,int b)
{
return a>b;
}
输入样例
3
abc 20 99
bcd 19 97
bed 20 97
输出样例
bcd 19 97
bed 20 97
abc 20 99
针对这种学生信息的问题,首先应该想到用结构体来封装各个属性:
struct Student
{
char name[101];
int age,score;
}buf[1000];
其次,因为它不仅仅存在对分数的排序,当分数相同时,还要比较姓名、年龄。所以我们在这里重新定义一个小于运算符
其中有两种方法:
- 在结构体中重载小于运算符:(关于重载运算符详细说明,可以参考菜鸟教程)
bool operator < (const student &b) const{
if(score!=b.score) return score<b.score;
int tmp = strcmp(name,b.name);//Greater:1 ,Less:-1, Equal:0
if(tmp!=0)//姓名不一样时
return tmp<0;
else return age<b.age;
}
调用时:sort(a,a+n);
- cmp函数定义
bool cmp(struct student &a,struct student &b)
{
if(a.score!=b.score) return a.score<b.score;
int tmp = strcmp(a.name,b.name);
if(tmp!=0)
return tmp<0;
else return a.age<b.age;
}
调用时:sort(a,a+n,cmp);
代码如下
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct student{
char name[101];
int age,score;
bool operator < (const student &b) const{
if(score != b.score) return score<b.score;
int tmp = strcmp(name,b.name);
if(tmp!=0)
return tmp<0;
else
return age<b.age;
}
}buf[1001];
bool cmp(struct student &a,struct student &b)
{
if(a.score!=b.score) return a.score<b.score;
int tmp = strcmp(a.name,b.name);
if(tmp!=0)
return tmp<0;
else return a.age<b.age;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%s %d%d",buf[i].name,&buf[i].age,&buf[i].score);
}
// sort(buf,buf+n,cmp);//定义cmp函数时
sort(buf,buf+n);//定义重载运算符时
for(int i=0;i<n;i++)
{
printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);
}
}
return 0;
}