排序技巧——双关键字排序

一个萌新的成长之路

Background

  • 在做题过程中,我们常会遇到对双关键字排序的情况,如:当分数相等时,序号小的在前.
  • 这时我们可以通过定义cmp函数作为sort的参数进行排序.

    Solution

  • 定义一个结构体,包含我们所需的关键字。例如,这是一个包含分数,序号和姓名的结构体.
    struct node{
    int id,score;
    string name;
    };

    -实现cmp函数,这里使用了两组不同的关键字.

    bool cmp_score_id(node a,node b)
    {
    if(a.score==b.score)return a.id<b.id;
    return a.score>b.score;
    }
    bool cmp_score_name(node a,node b)
    {
    if(a.score==b.score)return a.name<b.name;
    return a.score>b.score;
    }

    -代码如下:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct node{
    int id,score;
    string name;
    }stu[1000];
    bool cmp_score_id(node a,node b)
    {
    if(a.score==b.score)return a.id<b.id;
    return a.score>b.score;
    }
    bool cmp_score_name(node a,node b)
    {
    if(a.score==b.score)return a.name<b.name;
    return a.score>b.score;
    }
    int main()
    {
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)//卡常小技巧,++i较i++更快.
        scanf("%d%d%s",&stu[i].id,&stu[i].score,&stu[i].name);
    sort(stu+1,stu+1+n,cmp_score_id);
    for(int i=1;i<=n;++i)printf("%d %d",stu[i].id,stu[i].score);
    sort(stu+1,stu+1+n,cmp_score_name);
    for(int i=1;i<=n;++i)printf("%d %s",stu[i].score,stu[i].name);
    return 0;
    }
  • Jan,21,2017 Sun

原文地址:https://www.cnblogs.com/nishikino-curtis/p/8324821.html

时间: 2024-10-08 12:41:36

排序技巧——双关键字排序的相关文章

【基础练习】结构体定义比较函数双关键字排序

题目好长显得很高大上的样子其实一点也不是这样= = 再次感谢里奥同学的友情支持,没有他我现在还在一片云里雾里. 之前看ruka上一直说:可以自定义排序,但必须自定义小于号或者是比较函数,一直苦于如何实践,今天请教了里奥同学,终于拨云见日. 这样的题有很多类似的,像是codevs 3991排序(例题代码即为此题,但我会告诉你我是用后面那个题代码改的么···)  洛谷P1104 生日 都是很简单的多关键字排序 二话不说,上代码 //operator < and sort #include<cstd

c++结构体双关键字排序

1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node{ 4 int l,r; 5 }num[100010]; 6 int w_comp(const node &a,const node &b){ 7 if (a.l!=b.l) return a.l>b.l;//先比较第一个关键字,从大到小排序 8 return a.r<b.r;//比较第二个关键字,从小到大排序 9 } 10 int main(

c++中vector的pair与make_pair的使用,双关键字排序

#include <vector>#include <iostream>#include <algorithm>using namespace std;bool strict_weak_ordering(const pair<int,string> a, const pair<int,string> b){ return a.first > b.first;}//通过运算符重载,利用sort函数实现降序排列int main(){ vecto

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键字是数学成绩,第二个关键字是英

AC日记——双栈排序 洛谷 P1155

双栈排序 思路: 二分图染+模拟: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #define maxm 2000005 int n,head[maxn],E[maxm],V[maxm],cnt,col[maxn]; int minn[maxn],ai[maxn],sta1[maxn],sta2[maxn],top1,top2; bool if_[maxn][maxn]; inline void in(

NOIP2008 双栈排序

题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1不为空,将S1栈顶元素弹出至输出序列 操作c 如果输入序列不为空,将第一个元素压入栈S2 操作d 如果栈S2不为空,将S2栈顶元素弹出至输出序列 如果一个1~n的排列P可以通过一系列操作使得输出序列为1,2,…,(n-1),n,Tom就称P是一个“可双栈排序排列”.例如(1,3,2,4)就是一个“可

多关键字排序

很欢迎来看我的博客,我还有很多知识没有学习,这是我的考核作业!以此记录我的学习历程!大家参考就好!如有错误,敬请指出!在此,先谢谢一番! 多关键字排序就是基数排序,我是用单链表实现多关键字的排序的,但最主要的方法仍是"分配","收集".单链表只是在分配与收集过程中起暂时的存储作用.不仅可以用链表,还可以用栈.队列--(都是线性的!!!(^_^)) 这是结点类模板的定义: #ifndef NODE_H #define NODE_H #define NULL 0 tem

BZOJ 2080: [Poi2010]Railway 双栈排序

2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Status][Discuss] Description 一个铁路包含两个侧线1和2,右边由A进入,左边由B出去(看下面的图片) 有n个车厢在通道A上,编号为1到n,它们被安排按照要求的顺序(a1,a2,a3,a4....an)进入侧线,进去还要出来,它们要按照编号顺序(1,2,3,4,5....n)从通道B

二分图 and code1170 双栈排序

6.6二分图 二分图是这样一个图: 有两顶点集且图中每条边的的两个顶点分别位于两个顶点集中,每个顶点集中没有边直接相连接. 无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数. 判断二分图的常见方法是染色法: 开始对任意一未染色的顶点染色,之后判断其相邻的顶点中,若未染色则将其染上和相邻顶点不同的颜色, 若已经染色且颜色和相邻顶点的颜色相同则说明不是二分图,若颜色不同则继续判断,bfs和dfs都可以. 易知:任何无回路的的图均是二分图. 代码: bool Color(