【排序】多关键字排序

多关键字排序

题目描述:
有N个学生的数据,将学生数据按成绩高低排序(高在前低在后),如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序(从小到大),并输出N个学生排序后的信息。

输入:
输入数据第一行为整数N(N<=100),接下来的N行包括N个学生的数据。
每个学生的数据包括姓名(长度不超过20的字符串)、年龄(整数)、成绩(小于等于100的正数)。

输出:

按顺序输出学生信息,按照如下格式:
姓名 年龄 成绩

样例输入:
3
abc 20 99
bcd 19 97
bed 20 97

样例输出:
abc 20 99
bcd 19 97
bed 20 97

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

typedef struct student { 
    char name[20];
    int age, score;
}student;

student s[105];

bool compare(student s1, student s2) { 
    if (s1.score != s2.score)
        return s1.score > s2.score;
    else if (strcmp(s1.name, s2.name) != 0)
        return strcmp(s1.name, s2.name) < 0;
    else
        return s1.age < s2.age;
}

int main() { 
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) { 
        cin >> s[i].name >> s[i].age >> s[i].score;
    }
    sort(s, s + n, compare);
    for (int i = 0; i < n; ++i) { 
        cout << s[i].name << ' ' << s[i].age << ' ' << s[i].score << endl;
    }
    return 0;
}

注释:

bool compare(student s1, student s2) { 
    if (s1.score != s2.score) //比较成绩,如果不一样,就比较大小
        return s1.score > s2.score; // s1成绩高,就是true,sort的时候排在s2前面
    else if (strcmp(s1.name, s2.name) != 0) // 成绩相同,比较姓名
        return strcmp(s1.name, s2.name) < 0;//<0时,s1.name<s2.name,s1排在前面
    else
        return s1.age < s2.age;
}
//返回true的话就是前一个排在前面
    原文作者:勉強家
    原文地址: https://blog.csdn.net/weixin_42676667/article/details/111240664
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞