计算机历年考研复试上机题-成绩排序

计算机历年考研复试上机题-成绩排序

题目描述

查找和排序

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

示例:
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(升序)再分别输入他们的名字和成绩,以一个空格隔开

输出描述:

 

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

解题思路

          采用stl快速排序,重写排序函数,在输入时记录存放的成绩编号顺序,重写上升排序函数cmpUp和cmpDown,分别进行成绩递增和成绩递减排序,当成绩相同时,根据成绩编号,编号小的排在前面即可。

测试代码

#include <iostream>
#include <algorithm>
#define rep(i,s,e) for(int i = s;i<e;i++)
using namespace std;
struct Score{
    string name;
    int sc;
    int num;
    //Score(string n,int score,int nu):name(n),sc(score),num(nu){}
};
int cmpDown(Score s1,Score s2){
    if(s1.sc!=s2.sc){
        return s1.sc<s2.sc;
    }else {
        return s1.num<s2.num;
    }
}
int cmpUp(Score s1,Score s2){
    if(s1.sc!=s2.sc){
        return s1.sc>s2.sc;
    }else {
        return s1.num<s2.num;
    }
}
void print(Score *s,int n){
    rep(i,0,n){
        cout<<s[i].name<<" ";
        cout<<s[i].sc;
        cout<<endl;
    }
    return ;
}
int main(){
    int n,st;
    while(cin>>n>>st){
        Score students[n];
        rep(i,0,n){
            cin>>students[i].name;
            cin>>students[i].sc;
            students[i].num=i;
        }
        if(st==1){
            sort(students,students+n,cmpDown);
        }else{
            sort(students,students+n,cmpUp);
        }
        print(students,n);
    }
}

猜你喜欢

转载自blog.csdn.net/hnust_yangjieyu/article/details/82750617