有了前面的内容,对于一般的排序已经没有问题了,但是有时候排序的要求可能会有点刁。。。
举个简单的例子,应该是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具体怎么写看题干咯。。。