排序题与sort函数的应用

关于结构体数组类型的排序题~

1、相关结构体的定义

对于题目中给出了很多个体信息的排序题,考虑定义结构体存放。如student个体:

struct Student{
    char name[10]; //姓名
    char id[10]; //准考证号
    int score; //分数
    int r; //排名
}stu[100010];

2、cmp函数的编写

使用sort排序时,需提供cmp函数实现排序的规则。

例: 在考试的排序题,要求对所有学生先按分数从高到低排序,分数相同的按姓名的字典序从小到大排序。cmp函数如下:

bool cmp(student a,Student b){
    if(a.score!=b.score)
        return a.score>b.score;
    else
        return strcmp(a.name,b.name)<0;
}

关于strcmp函数:

        strcmp函数是string.h头文件下用来比较两个char型数组的字典序大小的,其中strcmp(str1,str2),当str1的字典序小于str2时返回一个负数,当str1的字典序等于str2时返回0,当str1的字典序大于str2时返回一个正数。

        对于cmp函数里的strcmp(a.name,b.name)<0,即表示a.name的字典序小于b.name的字典序,那么 return strcmp(a.name,b.name)<0;也就是表示此时按姓名的字典序从小到大排序。

 

 3、排名的实现

很多排序题都会要求在排序之后计算出每个个体的排名,并且规则一般是:分数不同的排名不同,分数相同的排名相同(占用一个排位)。例如有5个学生的分数为95,88,88,88,92,那么这5个学生的排名是:1,2,2,2,5

对这种要求,一般都要在结构体类型定义时就要把排名这一项加到结构体中,于是在数组排序完成后就有下面两种方法来实现排名的计算:

(1)先将数组第一个个体(假设数组下标从0开始)的排名记为1,然后遍历剩余个体:如果当前个体的分数等于上一个个体的分数,那么当前个体的排名等于上一个个体的排名,否则,当前个体的排名等于数组的下标加1。代码如下:

stu[0].r=1;
for(int i=0;i<n;i++){
    if(stu[i].score==stu[i-1].score)
        stu[i].r=stu[i-1].r;
    else
        stu[i].r=i+1;
}

(2)而有时题目中不一定需要真的把排名记录下来,而是直接输出即可,那么也可以用这样的方法:令int型变量r的初值为1,然后遍历所有个体:如果当前的个体不是第一个个体且当前个体的分数不等于上一个个体的分数,那么令r等于数组的下标加1,这时r就是当前个体的排名,直接输出即可。

int r=1;
for(int i=0;i<n;i++){
    if(i>0 && stu[i].score!=stu[i-1].score)
        r=i+1;
    //输出当前个体的信息。或者令stu[i].r=r也行
}

这样的做法适合于需要输出的信息过多,导致第一种方法代码冗长的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值