成绩排序
算法知识视频讲解
较难 通过率:22.85% 时间限制:1秒 空间限制:32M
知识点
排序
题目
题解(23)
讨论(260)
排行
warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
查找和排序

题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。

例示:
jack 70
peter 96
Tom 70
smith 67

从高到低 成绩
peter 96
jack 70
Tom 70
smith 67

从低到高

smith 67

jack 70

Tom 70
peter 96

注:0代表从高到低,1代表从低到高

本题含有多组输入数据!
输入描述:
输入多行,先输入要排序的人的个数,然后分别输入他们的名字和成绩,以一个空格隔开

输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

示例1
输入:
3
0
fang 90
yang 50
ning 70
复制
输出:
fang 90
ning 70
yang 50
复制
示例2
输入:
3
1
fang 90
yang 50
ning 70
3
0
moolgouua 43
aebjag 87
b 67
复制
输出:
yang 50
ning 70
fang 90
aebjag 87
b 67
moolgouua 43
复制
说明:
第一组用例:
3
1
fang 90
yang 50
ning 70
升序排序为:
yang 50
ning 70
fang 90
第二组降序为:
aebjag 87
b 67
moolgouua 43

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;
struct Student {
    string name;
    int age;
};

// 当 a > b,则降序(从大到小);
bool StudentCmp1(Student stu1, Student stu2) {
    return stu1.age > stu2.age;
}

//当a<b,则升序(从小到大)
bool StudentCmp2(Student stu1, Student stu2) {
    return stu1.age < stu2.age;
}
/*
* 排序:升序或降序
* 思想:输入一对数据的数组,其类型设为结构体,将一对数据按照make_pair(T1, T2)格式插入vector,
*     sort进行排序,默认为升序,cmp函数比较:当a<b为降序。
*/
int StudentSort(vector<Student> &stu, int flag)
{
    if(flag == 0) {  //0为降序
        /*快速排序sort与基于归并排序stable_sort的区别:
        *对于相等的元素sort可能改变顺序,stable_sort保证排序后相等的元素次序不变;
        */
        // sort(stu.begin(), stu.end(), StudentCmp1); // 快速排序
        stable_sort(stu.begin(), stu.end(), StudentCmp1); // 快速排序
    } else if (flag == 1) { //1 为升序
        stable_sort(stu.begin(), stu.end(), StudentCmp2); // 基于归并排序实现的
    } 
    return 0;
}
int main()
{
    int num;
    int flag;
    vector<Student> stu;
    while(cin>>num>>flag) {
        stu.clear();
        for(int i = 0; i < num; i++) {
            Student stuTemp;
            cin>>stuTemp.name>>stuTemp.age;
            stu.push_back(stuTemp);
            //cin>>stu[i].name>>stu[i].age; // vector不能直接赋值,静态数组可以直接赋值
        }

        int ret = StudentSort(stu, flag);
        if (ret == -1) {
            return -1;
        }

         for(auto iter = stu.begin(); iter != stu.end(); ++iter) {
            cout<<iter->name<<" "<<iter->age<<endl;
         }

        /*
        for(int i = 0; i < stu.size(); i++) {
            cout<<stu[i].name<<" "<<stu[i].age<<endl;
        }
        */

    }

    return 0;
}