- C24kongxiangtai's blog
【📄笔记📄】结构体三种排序方式
- 2024-12-18 17:06:14 @
📄笔记📄
来自
@刘蕴泽 的blog
但实际上是何老师写的
//注意sort类似快排,O(nlogn),要稳定可以手写或者stable_sort
/*
方法一:lambda表达式
方法二:重载<运算符
方法三:实现cmp()函数
版本低的不支持lambda表达式,在线演示下https://www.jyshare.com/compile/12/
输出
name =王,mathgrade = 30, chinesegrade = 50
name =钱,mathgrade = 20, chinesegrade = 40
name =孙,mathgrade = 50, chinesegrade = 30
name =赵,mathgrade = 10, chinesegrade = 20
name =李,mathgrade = 40, chinesegrade = 10
*/
//方法一:lambda表达式
//#include <iostream>
//#include <algorithm>
//using namespace std;
//struct Student{
// string name;
// int MathGrade;//数学成绩
// int ChineseGrade; //语文成绩
//};
//int main(){
//
// Student students[5];
// students[0]={"赵",10,20};
// students[1]={"钱",20,40};
// students[2]={"孙",50,30};
// students[3]={"李",40,10};
// students[4]={"王",30,50};
// //语文成绩大的学生排在前面,结构体中的变量chineseGrade
// sort(students, students+5, [](Student a, Student b){return a.ChineseGrade >= b.ChineseGrade;});
// for(int i=0;i<5;i++)
// cout << "name =" << students[i].name
// <<",mathgrade = "<< students[i].MathGrade
// <<", chinesegrade = "<<students[i].ChineseGrade<<endl;
// return 0;
//}
//方法二:重载<运算符。最重要的方法
#include <iostream>
#include <algorithm>
using namespace std;
struct Student{
string name;
int MathGrade;//数学成绩
int ChineseGrade; //语文成绩
bool operator <(const Student& tmp) const {//注意两个const必须写,Student&的&可以没有
return ChineseGrade>=tmp.ChineseGrade;
}
};
int main(){
Student students[5];
students[0]={"赵",10,20};
students[1]={"钱",20,40};
students[2]={"孙",50,30};
students[3]={"李",40,10};
students[4]={"王",30,50};
//语文成绩大的学生排在前面,结构体中的变量chineseGrade
sort(students, students+5);//sort本质是用了小于号
for(int i=0;i<5;i++)
cout << "name =" << students[i].name
<<",mathgrade = "<< students[i].MathGrade
<<", chinesegrade = "<<students[i].ChineseGrade<<endl;
return 0;
}
//方法三:实现cmp()函数
//#include <iostream>
//#include <algorithm>
//using namespace std;
//struct Student{
// string name;
// int MathGrade;//数学成绩
// int ChineseGrade; //语文成绩
//};
//bool cmp(Student a, Student b){
// return a.ChineseGrade>=b.ChineseGrade;
//}
//int main(){
//
// Student students[5];
// students[0]={"赵",10,20};
// students[1]={"钱",20,40};
// students[2]={"孙",50,30};
// students[3]={"李",40,10};
// students[4]={"王",30,50};
// //语文成绩大的学生排在前面,结构体中的变量chineseGrade
// sort(students, students+5, cmp);
// for(int i=0;i<5;i++)
// cout << "name =" << students[i].name
// <<",mathgrade = "<< students[i].MathGrade
// <<", chinesegrade = "<<students[i].ChineseGrade<<endl;
// return 0;
//}
//第k名成绩示例,sort原始<是升序排序,小的在前。重载operator后理解成<返回true则让当前元素排在前面
//#include <iostream>
//#include <algorithm>
//using namespace std;
//const int maxn=110;
//struct Student{
// int id;
// float score;
//// bool operator <(const Student s2)const{
////// return score<s2.score;// cout<<stu[n-k+1].id<<" "<<stu[n-k+1].score;
//// return score>s2.score;
//// }
//}stu[maxn];
//bool cmp(Student s1,Student s2){
// return s1.score>s2.score;
//}
//int main(){
// int n,k;
// cin>>n>>k;
// for(int i=1;i<=n;i++){
// cin>>stu[i].id>>stu[i].score;
// }
// sort(stu+1,stu+n+1,cmp);
//// sort(stu+1,stu+n+1);
//// for(int i=1;i<=n;i++){
//// cout<<stu[i].id<<" "<<stu[i].score<<endl;
//// }
// cout<<stu[k].id<<" "<<stu[k].score;
// return 0;
//}