排序小记【2】对 struct 的排序

有了前面的内容,对于一般的排序已经没有问题了,但是有时候排序的要求可能会有点刁。。。

举个简单的例子,应该是NOIP2009的分数线划定,差不多算是一个比较高级的排序(吧)。

多关键字排序(?)

我一直以为是这个名字的,弄错了别打我。。。

比方说对一群学生的考试成绩排序,同分的学生那么序号小的排前面

刚道理我是不知道怎么对两个数组这么排的,所以我就把它挂在一起:

1 struct seq{
2     int order;
3     int mark;
4 };

//当然二维数组也可以,应该可以转化为前一篇的内容,只要把cmp改写一下就好了(没试过)

为此,cmp就要改写一下,满足sort的需求:

1 bool cmp(seq a,seq b){
2     if (a.mark == b.mark){
3         return a.order < b.order;
4     }
5     else{
6         return a.mark > b.mark;
7     }
8 }

问题来了:sort怎么写?

度娘了一下,sort的前两个参数类型是指针,分别指向序列头和序列尾。那坠吼啊,取地址就好了。

1 sort(&line[1],&line[n],cmp);

然而又错了一波,而且错因和前一篇一样(不说了直接改)

1 sort(&line[1],&line[n+1],cmp);//1-n序列排序的正确写法

苦力老师对不起把我打死吧。。。

全文如下:

 1 #include <cstdio>
 2 #include <algorithm>
 3 
 4 struct seq{
 5     int order;
 6     int mark;
 7 };
 8 
 9 bool cmp(seq a,seq b){
10     if (a.mark == b.mark){
11         return a.order < b.order;
12     }
13     else{
14         return a.mark > b.mark;
15     }
16 }
17 
18 using namespace std;
19 
20 seq line[10000];
21 int n;
22 
23 int main(int argc, char const *argv[]){
24     scanf("%d",&n);
25     for (int i = 1; i <= n; ++i){
26         scanf("%d %d",&line[i].order,&line[i].mark);
27     }
28     sort(&line[1],&line[n+1],cmp);
29     printf("\n");
30     for (int i = 1; i <= n; ++i){
31         printf("%d %d\n", line[i].order,line[i].mark);
32     }
33     return 0;
34 }

顺便练了一下struct。。。网上好多code都把数组写vector里,我是个蒟蒻,不是很会这些高级东西,不过原理想来差不多(逃

总结:

综上,对自定义数据结构struct进行排序,只要改写一下cmp就好了。如果在struct中重载比较运算符,那么functional里的诸如less<>()这些应该也能用。cmp具体怎么写看题干咯。。。

转载于:https://www.cnblogs.com/mojibake/p/7750824.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值