zoukankan      html  css  js  c++  java
  • 结构体与C++sort()函数的用法

    C++sort()函数的用法

    先看道题(本题来自http://codeup.cn/第26099):

    题目描述

    【问题描述】

    高三全省联合模拟考试刚刚结束,经过各科老师的努力,各个学科的改卷工作终于结束了,每位同学的各科分数也已经结算完毕。此时,老师们开始模拟各个高校录取情况。

    每个大学有自己的录取范围。例如,清华、北大招生约为理科全省前100名,复旦、上海交大在全省理科101至300名。老师们想要知道哪些同学可以进入某个名校。

    可是,统计软件突然失灵,查询和比对工作也无法进行,只有事先已经得到的理科每位同学的各科成绩。现在请你帮助老师编写一个程序,显示出可以进入某高校的名单。

    此次考试理科排名规则:

    1.按照语文、数学、外语、理科综合四门科目总分由高到低排名;

    2.若总分相同,则按照数学成绩由高到低排名;

    3.若总分和数学成绩都相同,按照理科综合成绩由高到低排名;

    4.若总分、数学、理科综合都相同,按照语文成绩由高到低排名;

    5.若总分、数学、理科综合、语文成绩都相同,则按照报名序号从小到大排序(这里报名序号为输入顺序,第1个输入就是1号,第100个输入就是100号)。

     

    【输入】

    第一行三个整数n,a和b,分别表示参加考试的人数和某高校的录取名次范围(从名次a到名次b)。

    接下来n行,每行4个整数,表示每位同学的每门学科的成绩。依次为语文、数学、英语、综合。成绩0<=x<=300。

     

    【输出】

    输出b-a+1行,排名在a~b名的同学信息。

    每行两个整数,分别为报名序号和总分(报名序号看题目描述),中间用空格分开。

     

     

    【输出输出样例1】

    range.in

    range.out

    6 3 5

    118 139 130 286

    105 130 129 296

    113 138 123 291

    104 133 119 283

    89 139 116 287

    103 127 118 288

    2 660

    4 639

    6 636

    【样例1解释】

    排序后由高到低

    序号                总分

    1 118 139 130 286 673

    3 113 138 123 291 665

    2 105 130 129 296 660

    4 104 133 119 283 639

    6 103 127 118 288 636

    5 89 139 116 287 631

    输出3~5名的序号和总分

    【输出输出样例2】

    range.in

    range.out

    7 3 5

    118 139 130 286

    105 130 129 296

    113 138 123 291

    105 130 129 296

    89 139 116 287

    107 127 116 286

    103 127 118 288

    2 660

    4 660

    7 636

    【样例2解释】

    排序后由高到低

    序号                总分

    1 118 139 130 286 673

    3 113 138 123 291 665

    2 105 130 129 296 660

    4 105 130 129 296 660

    7 103 127 118 288 636

    6 107 127 116 286 636

    5 89 139 116 287 631

    7号和6号同为636分,数学分数又相同,理科综合分数7号较高,因此排在6号前面。

    2号和4号所有成绩都相同,只能按照序号排序,2号在4号之前

     

    【数据范围】

    对于40%的数据,1<=a<=b<=n<=100,且保证每个人的总分都不相同。

    对于70%的数据,1<=a<=b<=n<=300。

    对于100%的数据,1<=a<=b<=n<=100000。

    代码如下:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct zdx{
    int xuhao;
    int yu;
    int shu;
    int ying;
    int zong;
    int zongf;
    };
    bool cmp(zdx x,zdx y){
    if(x.zongf==y.zongf){
    if(x.shu==y.shu){
    if(x.zong==y.zong){
    if(x.yu==y.yu){
    return x.xuhao<y.xuhao;
    }
    else return x.yu>y.yu;
    }
    else return x.zong>y.zong;
    }
    else return x.shu>y.shu;
    }
    else return x.zongf>y.zongf;
    }
    int main(){
    int n,a,b;
    scanf("%d%d%d",&n,&a,&b);
    zdx q[n+1];
    for(int i=1;i<=n;i++){
    scanf("%d%d%d%d",&q[i].yu,&q[i].shu,&q[i].ying,&q[i].zong);
    q[i].xuhao=i;
    q[i].zongf=q[i].yu+q[i].shu+q[i].ying+q[i].zong;
    }
    sort(q+1,q+n+1,cmp);
    for(int i=a;i<=b;i++){
    printf("%d %d ",q[i].xuhao,q[i].zongf);
    }
    return 0;
    }

     有关sort:

    (一)为什么要用c++标准库里的排序函数

    Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高!

    (二)c++标准库里的排序函数的使用方法

    I)Sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!

    II)Sort函数有三个参数:

    (1)第一个是要排序的数组的起始地址。

    (2)第二个是结束的地址(最后一位要排序的地址)

    (3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

    !!!!!!!cmp原理:从数列中随机取一个值为判断值y,与y前某一值x作比,以 return x>y为例:若返回值为真,即x>y,则不作改变,若返回值为否,则交换x与y的位置;

    Sort函数使用模板:

    Sort(start,end,,排序方法)

    下面就具体使用sort()函数结合对数组里的十个数进行排序做一个说明!

    例一:sort函数没有使用第三个参数,默认升序,实现的是从小到大。

    #include<iostream>

    #include<algorithm>

    using namespace std;

    int main()

    {

     int a[10]={9,6,3,8,5,2,7,4,1,0};

     for(int i=0;i<10;i++)

     cout<<a[i]<<endl;

    sort(a,a+10);

     for(int i=0;i<10;i++)

     cout<<a[i]<<endl;

     return 0;

    }

    例二

    通过上面的例子,会产生疑问:要实现从大到小的排序肿么办?

     这就如前文所说需要在sort()函数里的第三个参数里做文章了,告诉程序我要从大到小排序!

    需要加入一个比较函数 complare(),此函数的实现过程是这样的

    bool complare(int a,int b)

    {

     return a>b;

    }

    这就是告诉程序要实现从大到小的排序的方法!

    #include<iostream>

    #include<algorithm>

    using namespace std;

    bool complare(int a,int b)

    {

     return a>b;

    }

    int main()

    {

     int a[10]={9,6,3,8,5,2,7,4,1,0};

     for(int i=0;i<10;i++)

     cout<<a[i]<<endl;

     sort(a,a+10,complare);//在这里就不需要对complare函数传入参数了,//这是规则

     for(int i=0;i<10;i++)

     cout<<a[i]<<endl;

     return 0;

    }

    例三:

    Sortt函数的第三个参数可以用这样的语句告诉程序你所采用的排序原则

    less<数据类型>()//从小到大排序

    greater<数据类型>()//从大到小排序

    结合本例子,这样的就可以完成你想要的任何一种排序原则了

    #include<iostream>

    #include<algorithm>

    using namespace std;

    int main()

    {

     int a[10]={9,6,3,8,5,2,7,4,1,0};

     for(int i=0;i<10;i++)

     cout<<a[i]<<endl;

    sort(a,a+10,less<int>());

     for(int i=0;i<10;i++)

     cout<<a[i]<<endl;

     return 0;

    }

  • 相关阅读:
    Android中手机录屏并转换GIF的两种方式
    Android中访问sdcard路径的几种方式
    Android中开发工具Android Studio修改created用户(windows环境)
    [UOJ211][UER #6]逃跑
    [CF1168D]Anagram Paths
    [CF852H]Bob and stages
    Codechef BINOMSUM
    [ZJOI2019]开关
    [CF1161F]Zigzag Game
    [CF1149E]Election Promises
  • 原文地址:https://www.cnblogs.com/ziyuan122625/p/12001015.html
Copyright © 2011-2022 走看看