今天做了一些排序题,总结一下他们的常用解题步骤叭:
1.定义相关的结构体
因为题目让你排序的时候,会给出个体很多的相关信息,例如学生的学号,姓名,班级,成绩等等,然后会要求根据某一规则对其进行排序,为了编写方便,我们可以把一个个体的信息一起存放在一个结构体中,例如:
typedef struct
{
char no[15];//学号
int score;//分数
...//其他一些信息
}STU;
2.编写cmp函数
在考试的时候,我们可以直接使用c++中的sort函数进行排序,然后用cmp函数规定它的排序规则,这样可以节省我们很多的时间,让我们把更多的精力放到整个题目的逻辑结构上。
先说一下sort函数叭~
介绍一下sort函数的使用方法: 首先要使用头文件#include<algorithm>
然后记得写using namespace std;
哦~使用方式如下
sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填));
比较函数就是定义一下你需要的排序规则,如果不写比较函数的话,则默认为从小到大排序,写了就按照你给的规则进行排序。
好了,我们了解了sort函数,再来看下它的cmp函数叭,我们需要cmp函数提供的规则进行排序。在考试中的考试题经常遇到这样的情况:对所有的学生先按照分数进行排序,如果分数相同,则学号小的写在前面。
遇到这样的规则我们怎么编写cmp函数呢?
例如:上面的规则可以写成
bool cmp(STU s1,STU s2)
{
if(s1.score!=s2.score) return s1.score>s2.score;
else return strcmp(s1.no,s2.no)<0;
}
此时
sort(a,a+n,cmp);
即可对数组的前 n 个元素根据规定的比较规则进行排序(也可以是其他区间内的元素,根据题目的要求进行编写)
记忆方法: 如果要把数据从小到大排序,就用“<”,因为“a<b”就是左小右大;如果要把数据从大到小排序,就用“>”,因为“a>b”就是左大右小。
3.排名
一般要求的规则是:分数不同的排名不同,分数相同的并列! 比如5个人的成绩分别为94,90,88,88,80,则他们的排名为1,2,3,3,5;
对于这样的排名规则,我们一般可以把名次这一项加入到结构体中,然后用以下两种方法进行排名(已经按照规则排好序,现在就是给出排名):
- 先将数组的第一个个体的排名记为1,然后遍历剩余个体,如果当前个体的分数和他前一个个体的分数相同,则令当前个体的排名等于前一个个体的排名;如果不相同,则令当前个体的排名为数组的下标+1;
代码如下:
stu[0].r=1;//先将数组的第一个个体的排名记为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;//如果不相同,则令当前个体的排名为数组的下标+1;
- 另外一种方法是不需要将排名存起来,而是直接输出就可以。具体思路如下:
使用一个整形变量r,先令变量r的初始值为1,然后遍历所有个体,如果当前个体不是第一个个体并且当前个体的分数不等于前一个个体的分数,那么令r等于数组的下标+1。
代码如下:
int r=1;
for(int i=0;i<n;i++)
{
if(i>0&&stu[i].score!=stu[i-1].score)
{
r=i+1;
}
printf("%d",r);//或者顺便输出一些个体其他相关信息
}