排序题型的常用解题步骤
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;
}
——摘抄自《算法笔记》