描述
给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。
示例:
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代表从低到高
数据范围:人数:1≤n≤200
进阶:时间复杂度:O(nlogn) ,空间复杂度:O(n)
输入描述:
第一行输入要排序的人的个数n,第二行输入一个整数表示排序的方式,之后n行分别输入他们的名字和成绩,以一个空格隔开
输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例1
输入:
3 0 fang 90 yang 50 ning 70
输出:
fang 90 ning 70 yang 50
示例2
输入:
3 1 fang 90 yang 50 ning 70
输出:
yang 50 ning 70 fang 90
#include <stdio.h>
typedef struct Stu{
char name[40]; //名字
int grade; //成绩
}Stu;
int main() {
int n; //人数
int mode; //排序方式:0-成绩降序,1-成绩升序
Stu s_arr[200];
// 1.输入
scanf("%d",&n);
scanf("%d",&mode);
for(int i=0;i<n;i++)
{
scanf("%s %d",s_arr[i].name,&s_arr[i].grade);
}
// 2.冒泡排序
Stu temp;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(mode==0) //降序
{
if(s_arr[j].grade < s_arr[j+1].grade)
{
temp=s_arr[j];
s_arr[j]=s_arr[j+1];
s_arr[j+1]=temp;
}
}
else if(mode==1) //升序
{
if(s_arr[j].grade > s_arr[j+1].grade)
{
temp=s_arr[j];
s_arr[j]=s_arr[j+1];
s_arr[j+1]=temp;
}
}
}
}
// 3.输出
for(int i=0 ; i<n ; i++)
{
printf("%s %d\n",s_arr[i].name,s_arr[i].grade);
}
}
【补充方法】C/C++版——使用C++中的sort排序
#include <cstdio>
#include<algorithm>
using namespace std;
struct Stu{
char name[40]; //名字
int grade; //成绩
int sequence; //记录录入的顺序!!!成绩相同时会用到
};
/*0:降序*/
bool compare_0_down(Stu left , Stu right)
{
//不交换的情况,返回true
if(left.grade > right.grade)
return true;
else if(left.grade == right.grade && left.sequence < right.sequence) //成绩相等时,按照录入顺序的不交换
return true;
else
return false;
}
/*1:升序*/
bool compare_1_up(Stu left , Stu right) //升序
{
//不交换的情况,返回true
if(left.grade < right.grade)
return true;
else if(left.grade == right.grade && left.sequence < right.sequence) //成绩相等时,按照录入顺序的不交换
return true;
else
return false;;
}
int main() {
int n; //人数
int mode; //排序方式:0-成绩降序,1-成绩升序
Stu s_arr[200];
// 1.输入
scanf("%d",&n);
scanf("%d",&mode);
for(int i=0;i<n;i++)
{
scanf("%s %d",s_arr[i].name,&s_arr[i].grade);
s_arr[i].sequence=i; //记录输入顺序
}
// 2.使用C++的sort排序
if(mode==0) //降序
sort(s_arr,s_arr+n,compare_0_down);
else //升序
sort(s_arr,s_arr+n,compare_1_up);
// 3.输出
for(int i=0 ; i<n ; i++)
{
printf("%s %d\n",s_arr[i].name,s_arr[i].grade);
}
}