python3 sort cmpp函数 为什么比较时a>=b这样会超时

STL中sort函数用法简介
STL中sort函数用法简介
火纸指印 发布于:
23:22&&&&来源:原创
做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。
这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int
a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。
拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序,就写sort(t,t+len);
对向量v排序也差不多,sort(v.begin(),v.end());
排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。
如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp
bool cmp(int a,int b)
&&& return
排序的时候就写sort(a,a+100,cmp);
&& 假设自己定义了一个结构体node
struct node{
&&& double
&& 有一个node类型的数组node
arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数:
以下是代码片段:
bool cmp(node x,node y)
if(x.a!=y.a) return x.aif(x.b!=y.b) return
return return x.c&y.c;
排序时写sort(arr,a+100,cmp);
最后看一个完整的实例,初赛时的一道题目“文件名排序 ”。
以下是代码片段:
#include&iostream&
#include&algorithm&
#include&string&
//定义一个结构体来表示文件,a代表文件名,b代表文件类型(要么"File"要么"Dir")
struct node{
&string a,b;
//ASCII码中,所有大写字母排在所有小写字母前面,'A'&'Z'&'a'&'z'
//而这题要求忽略大小写,所以不能直接用字符串的比较。自定义了一个lt函数,就是less than的意思
//先把两个字符串全部转化为小写,再比较大小(字典序)
bool lt(string x,string y)
&for(i=0;i&x.length();i++)
&&if(x[i]&='A'&&x[i]&='Z')
&&&x[i]='a'+(x[i]-'A');
&for(i=0;i&y.length();i++)
&&if(y[i]&='A'&&y[i]&='Z')
&&&y[i]='a'+(y[i]-'A');
//自定义的比较函数,先按b值升序排列(也就是"Dir"排在"File"前面)
//如果b值相同,再按a升序排列,用的是刚才定义的lt函数
bool comp(node x,node y)
&if(x.b!=y.b)return x.b&y.b;
&return lt(x.a,y.a);
int main()
&node arr[10001];
&int size=0;
&while(cin&&arr[size].a&&arr[size].b)
&sort(arr,arr+size,comp);
&for(int i=0;i&i++)
&&cout&&arr[i].a&&"
"&&arr[i].b&&
&return 0;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。9174人阅读
一、sort函数
sort函数是序列的内部函数
L.sort(cmp=None, key=None, reverse=False)
它是把L原地排序,也就是使用后并不是返回一个有序的序列副本,而是把当前序列变得有序
参数说明:
(1) &cmp参数
cmp接受一个函数,拿整形举例,形式为:
def f(a,b):
& & &return a-b
如果排序的元素是其他类型的,如果a逻辑小于b,函数返回负数;a逻辑等于b,函数返回0;a逻辑大于b,函数返回正数就行了
(2) &key参数
&key也是接受一个函数,不同的是,这个函数只接受一个元素,形式如下
& & &return len(a)
key接受的函数返回值,表示此元素的权值,sort将按照权值大小进行排序
(3) reverse参数
接受False 或者True 表示是否逆序
sort举例:
(1)按照元素长度排序
L = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
&&&&return&len(x)
sort(key=f)
[{1: 9}, {1: 5, 3: 4}, {1: 3, 6: 3}, {1: 1, 2: 4, 5: 6}]
(2)按照每个字典元素里面key为1的元素的值排序
L&= [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
def&f2(a,b):
&&&&return&a[1]-b[1]
L.sort(cmp=f2)
[{1: 1, 2: 4, 5: 6}, {1: 3, 6: 3}, {1: 5, 3: 4}, {1: 9}]
二、sorted函数
sorted函数是内建函数,他接受一个序列,返回有序的副本
他与sort的唯一区别就是会返回副本
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:62561次
积分:1059
积分:1059
排名:第16643名
原创:39篇
转载:22篇
评论:13条
(2)(2)(5)(2)(3)(2)(5)(6)(17)(1)(4)(2)(1)(1)(2)(1)(5)温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
id:'fks_',
blogTitle:'小结:C++排序sort函数的用法',
blogAbstract:'我某位神奇的同学归纳的&sort做OI题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。&&&&这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组inta[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。&&&&拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序,就写sort(t,t+len);',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}sort函数的用法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
26页免费7页2下载券15页免费3页¥1.002页免费 8页免费4页免费9页免费2页免费2页免费
喜欢此文档的还喜欢11页免费5页1下载券7页2下载券15页免费6页2下载券
sort函数的用法|福​建​农​林​大​学​A​C​M​内​部​的​资​料​,​综​合​的​几​种​排​序​的​算​法
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢

我要回帖

更多关于 vector sort cmp 的文章

 

随机推荐