【华为oj】成绩排序

问题描述:  查找和排序

题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。


 例示:

  jack      70

  peter     96

  Tom       70

  smith     67

  从高到低  成绩           

  peter     96   

  jack      70   

  Tom       70   

  smith     67   

   从低到高

  smith     67 

  Tom       70   

  jack      70   

  peter     96     

知识点:  排序 

题目来源:  内部整理 

练习阶段:  中级 

运行时间限制: 10Sec

内存限制: 128MByte

输入: 

输入多行,先输入要排序的人的个数,然后分别输入他们的名字和成绩,以一个空格隔开

用户名字,字符串,非空串,长度不超过20;

成绩,整数,范围【0,100】

输入排序方式,0或1,0表示成绩从高到低方式输出名字和成绩,1表示成绩从低到高方式输出名字和成绩

输出: 

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

样例输入: 3

0

fang 90

yang 50

ning 70                 

样例输出: fang 90

ning 70

yang 50

问题分析:结构体+冒泡排序

#include <iostream>
#include <string>
#include <vector>
using namespace std;

typedef struct student
{
	string name;
	int score;
}student;
int n;
void sort(vector<student>& s, int k);

int main()
{
	int k;
	cin>>n>>k;//输入录用人数和排序方式,0降序,1升序
	vector<student> s;//vector向量容器,存放student类型

	//成绩录入
	int i=0;
	student temp;
	for(i=0;i<n;i++)
	{
		cin>>temp.name>>temp.score;
		s.push_back(temp);
	}
	sort(s,k);//排序
	//打印输出排序后的成绩
	for(i=0;i<n;i++)
	{
		cout<<s[i].name<<" "<<s[i].score<<endl;
	}
	return 0;
}

void sort(vector<student>& s, int k)
{
	int i=0,j=0;
	string tempStr;
	int tempscore;
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-1-i;j++)
		{
			if(0==k)
			{
				if(s[j].score<s[j+1].score)
				{
					tempscore=s[j+1].score;
					s[j+1].score=s[j].score;
					s[j].score=tempscore;
					
					tempStr=s[j].name;
					s[j].name=s[j+1].name;
					s[j+1].name=tempStr;
				}
			}
			else
			{
				if(s[j].score>s[j+1].score)
				{
					tempscore=s[j].score;
					s[j].score=s[j+1].score;
					s[j+1].score=tempscore;

				    tempStr=s[j].name;
					s[j].name=s[j+1].name;
					s[j+1].name=tempStr;
				}
			}
		}
	}

}

代码2:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

typedef struct stusco
{
	string name;
	int score;
}stusco;

void sort(vector<stusco> &s,int n, int method)
{
	string tempname;
	int tempscore;
	int i=0,j=0;
	//默认从低排序到高
	for(i=0;i<n;i++)
	{
		for(j=0;j<n-i-1;j++)
		{
			if(s[j].score>s[j+1].score)
			{
				tempname=s[j].name;
				tempscore=s[j].score;
				s[j].name=s[j+1].name;
				s[j].score=s[j+1].score;
				s[j+1].name=tempname;
				s[j+1].score=tempscore;
			}
		}
	}
	if(method==1)//从低到高
	{
		for(i=0;i<n;i++)
			cout<<s[i].name<<" "<<s[i].score<<endl;
	}
	else//从高到低
	{
		for(i=n-1;i>=0;i--)
			cout<<s[i].name<<" "<<s[i].score<<endl;
	}

}

int main()
{
	int n;
	int method;
	cin>>n>>method;
	int i=0;
	vector<stusco> s;
	stusco student;
	for(i=0;i<n;i++)
	{
		cin>>student.name>>student.score;
		s.push_back(student);
	}
	sort(s,n,method);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值