成绩排序(清华机试题)

文章提供了一种按成绩对学生成绩单进行排序的方法,考虑了成绩相同的情况,使用C++中的sort函数或stable_sort函数,结合自定义比较函数实现升序或降序排列。在sort函数中,由于其不稳定性,需要额外记录输入顺序;而stable_sort则保持了稳定性。代码示例展示了如何处理这个问题。
摘要由CSDN通过智能技术生成

给定学生的成绩单,成绩单中包含每个学生的姓名和分数,请按照要求将成绩单按成绩从高到低或从低到高的顺序进行重新排列。

对于成绩相同的学生,无论以哪种顺序排列,都要按照原始成绩单中靠前的学生排列在前的规则处理。

输入格式

第一行包含整数 N,表示学生个数。

第二行包含一个整数 0 或 1,表示排序规则,0 表示从高到低,1 表示从低到高。

接下来 N 行,每行描述一个学生的信息,包含一个长度不超过 10 的小写字母构成的字符串表示姓名以及一个范围在 0∼100 的整数表示分数。

输出格式

输出重新排序后的成绩单。

每行输出一个学生的姓名和成绩,用单个空格隔开。

数据范围

1≤N≤1000

输入样例1:

4
0
jack 70
peter 96
Tom 70
smith 67

输出样例1:

peter 96
jack 70
Tom 70
smith 67

输入样例2:

4
1
jack 70
peter 96
Tom 70
smith 67

输出样例2:

smith 67
jack 70
Tom 70
peter 96

思路

这题虽然简单,但却是掌握sort函数的好例子,sort函数基于快排,所以不稳定,因此在输入数据时还要赋给数据输入的顺序。
使用sort函数可以重载小于号,也可以直接传入比较函数。

另:读者也可以使用stable_sort,基于归并排序,不用再为数据赋上顺序

代码

#include<iostream>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;

/*
    题目描述:按成绩排序,成绩相同以输入顺序先为先
        
*/
typedef struct student{//学生结构体
    string name;
    int mark;
    int order;//输入顺序
}stu;

bool cmp_Ascending(stu s1,stu s2){//升序排
    if(s1.mark == s2.mark)
        return s1.order < s2.order; 
    else return s1.mark < s2.mark;
}

bool cmp_Descending(stu s1,stu s2){//降序排
    if(s1.mark == s2.mark)
        return s1.order < s2.order; 
    else return s1.mark > s2.mark;
}
int main(){
    vector<stu> arr;
    int n;
    int type;//升序or降序
    int ord = 0;
    while(cin>>n){
        arr.clear();
        cin>>type;
        while(n--){
            stu s1;
            cin>>s1.name>>s1.mark;
            s1.order = ord++;
            arr.push_back(s1);
        }
        if(type)
            sort(arr.begin(), arr.end(), cmp_Ascending);
        else
            sort(arr.begin(), arr.end(), cmp_Descending);
        
        for(auto p : arr){
            cout<<p.name<<" "<<p.mark<<endl;
        }
        cout<<endl;
    }
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10mAh充电宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值