算法基础——排序——排序题与sort函数的应用

排序题型的常用解题步骤

1. 相关结构体的定义

对排序题,一定会在题目中给出个体许多信息,例如学生有姓名、准考证号、分数、排名等信息。为方便编写代码,常常将它们保存到一个结构体中,然后用结构体数组来表示多个个体。例如:

struct Student{
    char name[10];
    char id[10];
    int score;
    int r;
}stu[100010];

2. 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;
}

3. 排名的实现

一般规则:分属不同的排名不同,分数相同的排名相同 但 占用一个排位。

例如,五个学生分数为:90 88 88 88 86,那么排名分别是 1 2 2 2 5

对这种要求,一般需要在结构体类型定义 时 就把 排名 这一项加到结构体中。

① 先将数组第一个个体的排名记为1,然后遍历剩余个体。

如果  当前个体分数  等于  上一个个体的分数,那么  当前个体的排名  等于  上一个个体的排名,

否则,当前个体排名  等于 数组下标 加 1 

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

 

——摘抄自《算法笔记》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值