明德-结构体排序
2026-05-21 17:55:37
发布于:广东
一、结构体排序:也是利用sort排序来实现的,但是结构体排序必须写cmp,关键也是写cmp排序规则
注意:
1、cmp的类型要和结构体数组的类型保持一致
2、前和后的参数必须指定是用哪个成员来比较
例题:按不同分数排序
#include <bits/stdc++.h>
using namespace std;
//以总分来进行从高到低的排序,如果总分相等,用语文成绩从高到底排
//如果语文成绩相等,用数学成绩排。如果数学成绩相等,用英语成绩从高到底排
struct stu{
string name;
double chinese,math,eglish,sum;
}s[1010];
bool cmp(stu qian,stu hou){
//从正向来判断,整个逻辑框架很复杂,且容易出错
//逆向思维
//如果总分不相等,按总分,如果总分相等,语文成绩不相等,按语文,如果前两个相等,数学不相等,按数学
//结构体排序cmp的书写模板
if(qian.sum!=hou.sum){//第一优先级条件
return qian.sum>hou.sum;
}else if(qian.chinese!=hou.chinese){//第二优先级条件
return qian.chinese>hou.chinese;
}else if(qian.math!=hou.math){//第三优先级条件
return qian.math>hou.math;
}else{//第四优先级条件
return qian.eglish>hou.eglish;
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i].name>>s[i].chinese>>s[i].math>>s[i].eglish;
s[i].sum=s[i].chinese+s[i].math+s[i].eglish;
}
//结构体排序-->必须写cmp。why?-->结构体里面很多成员,如果不指定哪个成员,
//电脑不知道以哪个成员来排
sort(s****+n+1,cmp);
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;
}
这里空空如也











有帮助,赞一个