结构体快速排序(qsort)

桐桐的学校刚刚举行了期中考试,桐桐所在的七年级一共考了五个科目:语文、数学、英语、政治和历史。现在所有成绩都已经出来,班主任找到了桐桐,想让桐桐帮忙计算班里所有同学的五科总成绩,并按照总成绩由高到低的顺序排名,如果两个学生盼总成绩相同,则学号小的排在前面。你能够编写程序帮助桐桐完成任务吗?
第1行:一个数n(1≤n<100),表示桐桐所在班级的学生数;
第2行至第n+1行:第i行表示学号为i-1的学生的成绩(全部是整数,范围在O到1 00之间),每行有5个数,分别表示当前学生的五科成绩,相邻数之间用一个空格隔开。
只有1行,按总成绩由高到低的顺序输出对应学生的学号,相邻学号间用一个空格隔开。末尾也有空格

样例输入
5
89 76 80 67 90
70 80 78 95 92
65 77 88 98 100
82 68 99 87 69
100 92 87 79 90

样例输出
5 3 2 4 1

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

struct stu
{
    int num;
    int c,m,e,p,h;
    int sum;
};
int cmp(const void *a,const void *b)
{
    stu*p1=(stu*)a;
    stu*p2=(stu*)b;
    return p1->sum<p2->sum;
}//快速排序
void Input(struct stu a[],int n)
{
    int i;
    for (i=0;i<n;i++)
    {
        scanf("%d%d%d%d%d",&a[i].c,&a[i].m,&a[i].e,&a[i].p,&a[i].h);
        a[i].num=i+1;
    }
}
void s(struct stu a[],int n)
{
    int i,j;
    struct stu b;
    for (i=0;i<n;i++)
    {
       a[i].sum=a[i].c+a[i].m+a[i].e+a[i].p+a[i].h;
    }
    qsort(a,n,sizeof(stu),cmp);
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1-i;j++)
        {
            if (a[j].sum==a[j+1].sum)
            {
                if (a[j].num>a[j+1].num)
                {
                    b.num=a[j+1].num;
                    a[j+1].num=a[j].num;
                    a[j].num=b.num;
                }
            }
        }
    }
    for (i=0;i<n;i++)
    {
        printf("%d ",a[i].num);
    }
}
int main()
{
    int n;
    struct stu a[105];
    scanf("%d",&n);
    Input(a,n);
    s(a,n);
    return 0;
}

不知道为什么上图cmp有时候失效 故使用下图代码

int cmp(const void *a,const void *b)
{
     return ((struct stu *)b)->sum-((struct stu *)a)->sum;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值