成绩排序
给定学生的成绩单,成绩单中包含每个学生的姓名和分数,请按照要求将成绩单按成绩从高到低或从低到高的顺序进行重新排列。
对于成绩相同的学生,无论以哪种顺序排列,都要按照原始成绩单中靠前的学生排列在前的规则处理。
输入格式
第一行包含整数 N,表示学生个数。
第二行包含一个整数 0或 1,表示排序规则,0 表示从高到低,1表示从低到高。
接下来 N行,每行描述一个学生的信息,包含一个长度不超过 10 的小写字母构成的字符串表示姓名以及一个范围在 0∼100的整数表示分数。
输出格式
输出重新排序后的成绩单。
每行输出一个学生的姓名和成绩,用单个空格隔开。
数据范围
1≤N≤1000
成绩排序2
给定学生的成绩单,成绩单中包含每个学生的学号和分数,请将成绩单按成绩从低到高的顺序重新排序。
如果学生的成绩相同,则按照学号从小到大的顺序进行排序。
输入格式
第一行包含整数 N,表示学生数量。
接下来 N行,每行包含两个整数 p 和 q,表示一个学生的学号和成绩。学生的学号各不相同。
输出格式
输出重新排序后的成绩单。
每行输出一个学生的学号和成绩,用单个空格隔开。
数据范围
1≤N≤100,
1≤p≤100,
0≤q≤100
输入样例:
3
1 90
2 87
3 92
输出样例:
2 87
1 90
3 92
思路利用自定义类型的动态数组存放 学号和成绩 写compare函数 成绩从小到大排序 成绩相同按学号从小到大排序
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
struct MyType{
int num;
int score;
};
bool compare(MyType lhs,MyType rhs){
if(lhs.score<rhs.score)
{
return true;}
else if(lhs.score==rhs.score&&lhs.num<rhs.num)
{
return true;}
return false;
}
int main(){
int n,num,score;
scanf("%d",&n);
//需要排序两次 先按学号小到大排 再按学号小到大排 快排底层是不稳定的
//
vector<MyType> vec1;
for(int i=0;i<n;++i){
scanf("%d%d",&num,&score);
vec1.push_back({
num,score});
}
//排序
sort(vec1.begin(),vec1.end(),compare);
/* for(int i=0;i<n;++i){
printf("%d %d\n",vec1[i].num,vec1[i].score);
}*/
//我这里必须是稳定的排序 相同的成绩我的顺序别动我的了
for(int i=0;i<n;++i){
printf("%d %d\n",vec1[i].num,vec1[i].score);
}
}