题目描述
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
示例:
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);
}
}