深高北-L18-结构体排序
2026-04-17 17:32:29
发布于:广东
一、结构体排序:也是利用sort排序来实现的,但是结构体排序必须写cmp,关键也是写cmp排序规则
注意:
1、cmp的类型要和结构体数组的类型保持一致
2、前和后的参数必须指定是用哪个成员来比较
例题:按照ID排序
using namespace std;
struct stu{
string id;
double c,m,e,sum;
}a[110];
bool cmp(stu qian,stu hou){
return qian.id<hou.id;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].id>>a[i].c>>a[i].m>>a[i].e;
a[i].sum=a[i].c+a[i].m+a[i].e;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
cout<<a[i].id<<" "<<a[i].c<<" "<<a[i].m<<" "<<a[i].e<<" "<<a[i].sum<<endl;
}
return 0;
}
二、多种排序规则的结构体排序,关键就是在cmp里面写
例题:按照分数不同按照分数,分数相同按照名字字典序
#include <bits/stdc++.h>
using namespace std;
struct stu{
string name;
int sum;
}a[110];
bool cmp(stu qian,stu hou){
//请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前
//这句话的翻译就是:如果成绩不同,按成绩排,如果相同按名字排
if(qian.sum!=hou.sum){
return qian.sum>hou.sum;
}else{
return qian.name<hou.name;
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].name>>a[i].sum;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
cout<<a[i].name<<" "<<a[i].sum<<endl;
}
return 0;
}
T3
#include <bits/stdc++.h>
using namespace std;
struct stu{
string name;
//隐藏sum--总奖牌数
//id--用来解决输入顺序排序问题
int a,b,c,sum,id;
}a[100010];
bool cmp(stu qian,stu hou){
/*
题目:按照奖牌总数从高到低排序输出,
若总数相同则按照金牌从高到低排序,
若金牌相同则按照银牌从高到低排序,
若银牌相同则按照输入的顺序输出
*/
//翻译就是:
/*
题目:按照奖牌总数不同,按照总数从高到低排序输出,
否则如果总数相同,金牌数不同,则按照金牌从高到低排序,
否则如果金牌相同,银牌数不同,则按照银牌从高到低排序,
若银牌相同则按照输入的顺序输出--利用id
*/
if(qian.sum!=hou.sum){
return qian.sum>hou.sum;
}else if(qian.a!=hou.a){
return qian.a>hou.a;
}else if(qian.b!=hou.b){
return qian.b>hou.b;
}else{
return qian.id<hou.id;
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
//按顺序输入名字、金牌,银牌、铜牌
cin>>a[i].name>>a[i].a>>a[i].b>>a[i].c;
//总奖牌数=金牌+银牌+铜牌
a[i].sum=a[i].a+a[i].b+a[i].c;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
cout<<a[i].name<<" "<<a[i].sum<<endl;
}
return 0;
}
这里空空如也













有帮助,赞一个