一、自定义cmp函数(比较函数)
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 3e2 + 10;
struct Node{
int a, b, c, id, sum;
}p[N];
bool cmp (Node A, Node B)
{
if (A.sum == B.sum){ //AB两人总分相等的话
if (A.a == B.a) return A.id < B.id;//若a科目成绩相等,则按学号从小到大排序
else return A.a > B.a;//否则按照a科目成绩从大到小排序
}
else return A.sum > B.sum; //AB俩人总分不等的话,按总分从大到小排序!
}
int main()
{
int n;
cin >> n;
for (int i=1; i <= n; i ++)
{
cin >> p[i].a >> p[i].b >> p[i].c;
p[i].id = i, p[i].sum = p[i].a + p[i].b + p[i].c;
}
sort (p+1, p+1+n, cmp);
for (int i=1; i <= 5; i ++)
cout << p[i].id << ' ' << p[i].sum << endl;
return 0;
}
二、使用匿名函数
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 3e2 + 10;
struct Node{
int a, b, c, id, sum;
}p[N];
int main()
{
int n;
cin >> n;
for (int i=1; i <= n; i ++)
{
cin >> p[i].a >> p[i].b >> p[i].c;
p[i].id = i, p[i].sum = p[i].a + p[i].b + p[i].c;
}
sort (p+1, p+1+n, [&](Node L, Node R){
if (L.sum == R.sum)
{
if (L.a == R.a) return L.id < R.id;
else return L.a > R.a;
}
else return L.sum > R.sum;
});
for (int i=1; i <= 5; i ++)
cout << p[i].id << ' ' << p[i].sum << endl;
return 0;
}
三、重载小于号
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 3e2 + 10;
struct Node{
int a, b, c, id, sum;
bool operator < (const Node &x) const{
if (sum == x.sum){ //如果总分相等,
if (a==x.a) return id < x.id;//则按照学号id从小到大排序
else return a > x.a;//否则按照a科目成绩从大到小排序
}
else return sum > x.sum;//若不等则按照总分从大到小排序!
}
}p[N];
int main()
{
int n;
cin >> n;
for (int i=1; i <= n; i ++)
{
cin >> p[i].a >> p[i].b >> p[i].c;
p[i].id = i, p[i].sum = p[i].a + p[i].b + p[i].c;
}
sort (p+1, p+1+n);
for (int i=1; i <= 5; i ++)
cout << p[i].id << ' ' << p[i].sum << endl;
return 0;
}
四、改为从大到小排序:
方法一:
使用greater()
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[] = { 1, 2, 3, 4, 5 };
sort(arr, arr + 5, greater<int>());
for(int i = 0;i < 5;i++){
cout<< arr[i] <<" ";
}
return 0;
}
结果:5 4 3 2 1;
方法二:定义cmp函数:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = ;
bool cmp(int x,int y)
{
return x > y;
}
int main()
{
int arr[10];
for (int i = 0; i < 10; i++)
{
cin >> arr[i];
}
sort(arr,arr + 10);
for(int i = 0;i < 10;i++){
cout << arr[i] << " ";
}
cout << endl;
sort(arr,arr + 10,cmp);
for(int i = 0;i < 10;i++){
cout << arr[i] << " ";
}
cout << endl;
return 0;
}