HJ68 成绩排序

这篇文章讲述了如何使用C++编程语言实现一个功能,根据给定的学生姓名和成绩,按照指定的排序方式(降序或升序)进行排列,同时保持成绩相同情况下先录入的在前。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。

示例:
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);
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值