#include <bits/stdc++.h>//万能头文件
using namespace std;//不知道干啥的
struct student{//struct+结构体名
char s[100];//结构体中可定义多种变量
int y,m,d,sx;
};//此处也可写为 }str[100]},这时,下文******一行则不用再写
bool cmp(student a,student b){//cmp函数用来compare, bool+函数名(结构体名+随意符号1,结构体名+随意符号2
if(a.y!=b.y) return a.y<b.y;//年 输出较小的值
else if(a.m!=b.m) return a.m<b.m;//月
else if(a.d!=b.d) return a.d<b.d;//日
else if(a.sx!=b.sx) return a.sx>b.sx;//输入靠后的同学先输出
}
int main()
{
int n,i;
student str[500];//******
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s %d %d %d",&str[i].s,&str[i].y,&str[i].m,&str[i].d);//
str[i].sx=i;//记录每位同学的输入位次
}
sort(str+1,str+1+n,cmp);//sort函数,见下文解析
for(i=1;i<=n;i++)
printf("%s\n",str[i].s);
return 0;
}
sort函数
性质
···sort是c++自带函数
···复杂度 n*log(n)
···包含在头文件
···#include的c++标准库里
···函数有三个参数
···1.要排序的数组的起始地址
···2.数组的结束地址
···3.第三个参数是排序的方法,可以不写,默认是从小到大
举例1
···sort(a,a+n) -----默认从小到大排序
···比如 int a[ ]={2,7,1,5,0} 五个数
···我们可以写成 sort(a,a+5)·······a为数组名
···从小到大排序可以写成
···sort(a,a+n,less<要进行排序的数据类型>())
···从大到小排序可以写成
···sort(a,a+n,greater<要进行排序的数据类型>())
举例2
···结构体排序
···我们定义一个结构体
···typedef struct stu
···{ int xuehao;
··· int chengji;
···}stu;
···stu p[20];
···如果我们要按成绩排序
···可以写成sort(p,p+20,cmp1)
cmp函数的写法
举例1
比如我们要按成绩排序从高到低
bool cmp1(stu a,stu b)
{
return a.chengji>b.chengji;
}
刚才的int数组从小到大排序,我们还可以写成
bool cmp2(int a,int b)
{ return a<b;
}
举例2
还有一种情况
struct node
{ int x,y;
}a[10];
如果们要求a数组按x值的从小到大排序,若x相等,按y的从小到大排,我们写成:
bool cmp3(node a,node b)
{ if(a.x==b.x)
return a.y<b.y;
else return a.x<b.x;
}
结构体
定义
形式1
#include <bits/stdc++.h>
struct student{
char s[100];
int y,m,d,xs;
}str[100];//在主函数外定义了100组包含【char s[100]; int y,m,d,xs;】的数据
形式2
#include <bits/stdc++.h>
struct student{
char s[100];
int y,m,d,xs;
};
//··· ···省略些许行
int main()
{
//省略些许行
student str[100];在主函数内
}