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\n",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;

}

结构体与C++sort()函数的用法的更多相关文章

  1. 转载 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

    转载自:http://www.cnblogs.com/cj695/p/3863142.html sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在 ...

  2. 【转】 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

    sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能 ...

  3. 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

    sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能 ...

  4. 【C++】从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

    sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能 ...

  5. C/C++ sort函数的用法

    sort函数的用法(#include<algorithm>) 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比 ...

  6. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

  7. C++ sort()函数的用法

    C++sort()函数的用法 C++sort()函数的用法 近来看了c++标准库这本书,学到了很多,就把这其中的一点C++sort()函数的用法写下来和大家分享吧! (一)为什么要用c++标准库里的排 ...

  8. (60) 结构体指针、结构体变量嵌套、结构体指针嵌套、函数指针、数组指针、指针数组、typedef 综合运用

    #include<stdio.h> #include<iostream> #include<malloc.h> /* author : 吴永聪 program: 结 ...

  9. Sort函数的用法

    快速排序sort的用法:(适用于int float double char ...) 记得加头文件! 记得加头文件! 记得加头文件! 头文件: #include <algorithm>   ...

随机推荐

  1. sqlserver导入Excel数据 总是报错:错误 0xc020901c: 数据流任务 1: 输出“Excel 源输出”(55) 上的 输出列“T2”(64) 出错。返回的列状态是:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项

    在网络上搜索解决办法,解决办法是把excel导入到access数据库中,再把access数据库导入到sqlsever中,公司机器上不让安装office工具,问了一个同事得到的回答是把数据中很长的那行数 ...

  2. jquery中checkbox的全选与反选

    <!DOCTYPE html><html><head> <meta charset="utf-8" /> <title> ...

  3. Neo4J之标签类型

    Neo4J的标签可以理解一个类,在创建一个节点时可以设置一个或多个标签: 1. 标签名为中文(可以) CRATE(节点名:标签1:标签2{属性1:34} 创建了一个节点名为“节点名”的节点(不可以用节 ...

  4. java对日开发常用语(词汇)总结

    日语 英语 中文 备注 並び順(ならびじゅん) order by 排序   項目(こうもく)                         field 字段,域                    ...

  5. window事件

    window事件是较为重要的事件,接下来就讲解一下. 1.获取页面滚动栏的距离 什么是滚动栏,就是网页内容过多时,通过滚轮控制上下显示或者左右显示: 为窗口添加滚动条事件: window.onscro ...

  6. MySQL5.7安装、主从复制、读写分离原理解析以及详细配置

    一.Linux下mysql彻底卸载 1.查看mysql的安装情况 rpm -qa | grep -i mysql 2.删除上图安装的软件 rpm -ev mysql-community-libs--. ...

  7. 流程控制 if----else

    流程控制: 对PHP程序执行的过程进行控制! PHP有哪些手段对程序执行过程进行控制!一.顺序执行 自上而下的执行即可! 对这个执行过程没有控制!二.分支执行 分支执行可以根据条件是否满足来选择执行某 ...

  8. nginx的gzip模块详解以及配置

    文章来源 运维公会:nginx的gzip模块详解以及配置   1.gzip模块作用 gzip这个模块无论在测试环境还是生产环境都是必须要开启,这个模块能高效的将页面的内容,无论是html或者css.j ...

  9. python接口自动化1-requests-html支持JavaScript渲染页面

    前言 requests虽好,但有个遗憾,它无法加载JavaScript,当访问一个url地址的时候,不能像selenium一样渲染整个html页面出来.requests-html终于可以支持JavaS ...

  10. seo域名选择

    1-1第一选域名: 1,简单好记,有意义. 2,后缀首选com 其次cn 1-2购买域名网站有 1,阿里云 2,godaddy 3 ,景安 购买是可以在这三个域名平台都看看价格有些不一样.(可以省钱) ...