一.题目如下:
输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
输入描述:
输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开
输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
C++实现:
#include<iostream>
#include<string>
using namespace std;
struct S{
string name;
int score;
};
int main(){
int n;
int flag;
while(scanf("%d",&n)!=EOF){
cin>>flag;
S stu[n];
int k=0;
for(k;k<n;k++){
cin>>stu[k].name>>stu[k].score;
}
for(int j=0;j<n;j++){
int max=stu[0].score;
int min=stu[0].score;
int index=0;
for(int i=0;i<n;i++){
if(flag==0){
if(stu[i].score>max){
index=i;
max=stu[i].score;
}
}
else{
if(stu[i].score<min){
index=i;
min=stu[i].score;
}
}
}
cout<<stu[index].name<<" "<<stu[index].score<<endl;
if(flag==0){
stu[index].score=-1;
}
else{
stu[index].score=1000;
}
}
}
}
特别注意:
此题不应用C++已经封装好的函数sort+自定义升序降序算法实现,因为sort(快排)函数不稳定,即面对成绩相等的情况快排输出的顺序不确定。与下面的排序题型做下比较。
二.题目如下:
用一维数组存储学号和成绩,然后,按成绩排序输出。
输入描述:
输入第一行包括一个整数N(1<=N<=100),代表学生的个数。
接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。3
1 90
2 87
3 92
输出描述:
按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。
如果学生的成绩相同,则按照学号的大小进行从小到大排序。
2 87
1 90
3 92C++实现:
#include<iostream>
#include<algorithm>
using namespace std;
struct S{
int number;
int score;
};
bool cmp(S s1,S s2){
if(s1.score<s2.score)
return true;
else if(s1.score==s2.score){
return s1.number<s2.number;
}
else
return false;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
S stu[n];
for(int i=0;i<n;i++){
cin>>stu[i].number>>stu[i].score;
}
sort(stu,stu+n,cmp);
for(int i=0;i<n;i++){
cout<<stu[i].number<<" "<<stu[i].score<<endl;
}
}
}三.题目如下:
有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。
输入描述:
测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。 每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。
输出描述:
将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。 然后输出学生信息,按照如下格式: 姓名 年龄 成绩 学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。
输入
3 abc 20 99 bcd 19 97 bed 20 97
输出
bcd 19 97 bed 20 97 abc 20 99
C++实现:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
struct S{
string name;
int age;
int score;
};
bool cmp(S s1,S s2){
if(s1.score!=s2.score)
return s1.score<s2.score;
else{
//注意此处比较直接利用=即可
if(s1.name!=s2.name){
return s1.name<s2.name;
}
else
return s1.age<s2.age;
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
S stu[n];
for(int i=0;i<n;i++){
cin>>stu[i].name>>stu[i].age>>stu[i].score;
}
sort(stu,stu+n,cmp);
for(int j=0;j<n;j++){
cout<<stu[j].name<<" "<<stu[j].age<<" "<<stu[j].score<<endl;
}
}
}
版权声明:本文为zhang__shuang_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。