C++多关键字排序

一、自定义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;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值