笔试面试算法题解之华为-成绩排序
题目描述
用一维数组存储学号和成绩,然后,按成绩排序输出。
输入描述
输入第一行包括一个整数N(1<=N<=100),代表学生的个数。接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。
输出描述
按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。如果学生的成绩相同,则按照学号的大小进行从小到大排序
思路剖析:
先进行成绩排序,然后在进行成绩相同的时候,学好排序就行。
输入例子:
3
1 90
2 87
3 92
输出例子:
2 87
1 90
3 92
代码
#include<iostream>
#include<cstring>
#include<malloc.h>
#include<fstream>
#include<cstdio>
using namespace std;
typedef struct student{
int id;
int score;
};
int main()
{
freopen("debug\in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取
freopen("debug\out.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中
int n;
cin>>n;
student *stu;
stu=(student*)malloc((n+50)*sizeof(student));
for(int i=0;i<n;++i)
{
cin>>stu[i].id>>stu[i].score;
}
for(int i=0;i<n;++i)
{
for(int j=i;j<n;j++)
{
if(stu[j].score<stu[i].score)
{
student temp;
memcpy(&temp,&stu[i],sizeof(student));
memcpy(&stu[i],&stu[j],sizeof(student));
memcpy(&stu[j],&temp,sizeof(student));
}
}
}
for(int i=0;i<n;++i)
{
for(int j=i;j<n;j++)
{
if((stu[j].score==stu[i].score)&&(stu[j].id<stu[i].id))
{
student temp;
memcpy(&temp,&stu[i],sizeof(student));
memcpy(&stu[i],&stu[j],sizeof(student));
memcpy(&stu[j],&temp,sizeof(student));
}
}
}
for(int i=0;i<n;++i)
{
cout<<stu[i].id<<' '<<stu[i].score<<endl;
}
return 0;
}