给定学生的成绩单,成绩单中包含每个学生的姓名和分数,请按照要求将成绩单按成绩从高到低或从低到高的顺序进行重新排列。
对于成绩相同的学生,无论以哪种顺序排列,都要按照原始成绩单中靠前的学生排列在前的规则处理。
输入格式
第一行包含整数 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;
}