最新要闻
- 《暗黑破坏神4》B测神优化!N多RTX 3080 Ti惨遭黑屏变砖 暴雪:概不负责
- 天天新消息丨737 Max客机空难致346人丧生 波音最新表态:速度过快 乘客毫无痛苦地死去
- 海外爆发迄今最严峻禽流感疫情:专家详解
- 世界热点评!AMD终于能享受192GB内存了!连跑2小时0错误
- 特斯拉一“咳嗽”:国内汽车行业加速洗牌了
- 《艾尔登法环》更新上线 终于加入了光追功能
- 如何知道自己怀的是男孩女孩?(如何知道自己怀的是男孩女孩)
- 观热点:《艾尔登法环》光追配置需求公布:最低需RTX 3060 Ti
- 世界热门:48岁林志玲晒素颜近照:网友点赞笑容甜美状态好
- 天天最资讯丨中国人民大学苏州校区专业有哪些专业_中国人民大学苏州校区怎么样
- 焦点热讯:净利润翻倍超18亿元 爱玛电动车业绩大增送出股权激励
- 天天热点!1799元一台顶三台!小米米家无线洗地机2 Lite预售:吸拖洗都行
- 每日快看:蔚来CFO评价中国车企价格战:中国车企太多了
- 【快播报】私拉线路充电致17辆电动自行车被烧毁:科普飞线充电危害
- 今日要闻!华硕ROG新款XG Mobile显卡坞上市:搭载RTX 4090移动版 售价超2万
- 快资讯:“星月童话”来了!月掩金星天象明晚亮相:错过要等3年
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
全球今日报丨C++ 标准库 sort() / stable_sort() / partial_sort() 对比
C++ STL标准库中提供了多个用于排序的Sort函数,常用的包括有sort() / stable_sort() / partial_sort(),具体的函数用法如下表所示:
(资料图片仅供参考)
函数 | 用法 |
---|---|
std::sort(first,last) | 对容器或数组first~last范围内的元素进行排序,默认升序排序 |
std::stable_sort(first,last) | 对容器或数组first~last范围内的元素进行排序,保持原有数组相对顺序,默认升序排序 |
std::partial_sort(first,middle,last) | 在容器或数组first~last范围内,查找最小(大)middle-first个元素排序,放入first-middle区间,默认升序 |
1. std::sort(first,last)
std::sort()是STL标准库提供的模板函数,用于对容器或者数组中指定的范围(first~last)元素进行排序,默认的排序方法是以元素的值的大小做升序排序,同时也可以指定其他的排序规则(如std::greater),也可以自定义排序规则。
std::sort()函数底层基于快速排序进行实现,时间复杂度为N * log(N),因此需要容器或者数组注意以下几点:
- 容器的迭代器必须是随机访问迭代器,如std::array、std::vector、std::deque。
- 如果采用默认的升序排序方法,则元素必须支持operate<运算符。
- 自定义类对象容器使用std::sort()排序时,因为需要交换位置,所以必须提供拷贝构造函数和赋值运算符。
- std::sort()无法保证相同元素的原始位置,这里的相同是指进行比较的结果为相等,而对象本身不相同。如果需要保持相对顺序相同,则应该使用std::stable_sort()
不同库对std::sort()的实现:libstdc++和libc++.
示例代码:
#include#include#include#includeusing namespace std;void Print(std::string message,const std::vector& vec){ cout << message << ": "; for(const auto c : vec)cout << c << " "; cout < myVector{5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; // 1. 以默认的排序规则 std::sort(myVector.begin(),myVector.end()); Print("Sorted Default", myVector); // 2. 以标准库的greater函数进行排序 std::sort(myVector.begin(),myVector.end(),std::greater()); Print("Sorted Standard Compare Function",myVector); // 3.以自定义的函数定义排序规则 // lamda 表达式 auto cmp1 = [](const int a,const int b) { return a < b; }; std::sort(myVector.begin(),myVector.end(),cmp1); Print("Sorted Lamda Function",myVector); // 可调用对象 struct { bool operator()(const int a,const int b){return a > b;} } cmp2; std::sort(myVector.begin(),myVector.end(),cmp2); Print("Sorted Function Object",myVector); return 0;}
输出结果为:
Sorted Default : 0 1 2 3 4 5 6 7 8 9Sorted Standard Compare Function : 9 8 7 6 5 4 3 2 1 0Sorted Lamda Function : 0 1 2 3 4 5 6 7 8 9Sorted Function Object : 9 8 7 6 5 4 3 2 1 0
2. std::stable_sort(first,last)
使用std::sort()的一个问题是在排序时,无法保证值相等时的元素相对位置保持不变,如果程序中对相对顺序有要求,那么就需要使用std::stable_sort(),这是对std::sort()的一个升级版本,调用的方式和std::sort()相同,但是可以保证排序后的结果能够保持原有的相对顺序。
std::stable_sort()底层是基于归并排序,时间复杂度是N * log(N)^2,如果可以使用额外的内存空间,那么时间复杂度可以降低为N * log(N),std::sort()对容器和数组的要求与std::sort()相同。
不同库对std::stable_sort()的实现:libstdc++和libc++.
3. std::partial_sort(first,middle,last)
上述的std::sort()和std::stable_sort()都是对所选的范围内的所有数据进行排序,但是如果对于一个容器或者数组,我们只需要找到其最小的几个元素,那么采用全局排序的方法效率将会很低,尤其是容器中的元素数量非常大时,将会对性能产生很大的影响。因此,C++标准库提供了std::partial_sort()函数,来应用于这种场景。
std::partial_sort()函数的功能从其名字就可以得到,可以理解为部分排序,即从元素区间范围内取出部分元素进行排序。函数参数列表中first,last表示元素范围,middle用于定义需要进行排序的元素个数,具体的,std::partial_sort()会将范围first-last范围内最小(大)的middle-first个元素移动到first~middle范围,并对这些元素进行升(降)序排序。
std::partial_sort()底层采用堆排序,时间复杂度为N * log(M),其中N为last-first,M为middle-first。由于底层实现的限制,std::partial_sort()对容器的要求与std::sort()和std::stable_sort()相同。
不同库对std::stable_sort()的实现:libstdc++和libc++.
示例代码:
#include#include#include#includeusing namespace std;void Print(std::string message,const std::vector& vec){ cout << message << ": "; for(const auto c : vec)cout << c << " "; cout < myVector{5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; // 1. 以默认的排序规则 std::partial_sort(myVector.begin(),myVector.begin() + 4,myVector.end()); Print("Sorted Default", myVector); // 2. 以标准库的greater函数进行排序 std::partial_sort(myVector.begin(),myVector.end(),std::greater()); Print("Sorted Standard Compare Function",myVector); // 3.以自定义的函数定义排序规则 // lamda 表达式 auto cmp1 = [](const int a,const int b) { return a < b; }; std::sort(myVector.begin(),myVector.end(),cmp1); Print("Sorted Lamda Function",myVector); return 0;}
Sorted Default: 0 1 2 3 8 7 6 9 5 4Sorted Standard Compare Function: 9 8 7 6 5 0 1 2 3 4Sorted Lamda Function: 0 1 9 8 7 6 5 2 3 4
* C#中的Array.Sort()
笔者在用C++复刻C#代码的时候发现对相同的数组排序的结果有时候会出现不一致,查了C#的官方文档后才发现,C#中Array.Sort()函数是unstable_sort,也就是说其排序是无法保证相对顺序的,而且Array似乎也没有提供Stable_Sort版本的排序函数,因此如果需要保证相对顺序不变,需要手动给原始的数据添加一个index,这样再其他的key判等都相等时可以采用额外的Index来保持相对的原始序。而且有意思的是,Array.Sort()函数具体使用的排序方法是根据数据规模发生改变的
-如果数据量小于等于16个,则采用插入排序-如果需要排序的数量超过2 * log(N),其中N为输入的排序范围,则采用堆排序-其余情况均采用快速排序
以上是对常用的标准库排序算法的总结和不同语言的对比,可以根据实际需要和数据量的大小来选择合适的排序算法。
关键词:
-
全球今日报丨C++ 标准库 sort() / stable_sort() / partial_sort() 对比
C++STL标准库中提供了多个用于排序的Sort函数,常用的包括有sort() stable_sort() partial_sort(),具...
来源: 微服务实用篇--学习笔记
全球今日报丨C++ 标准库 sort() / stable_sort() / partial_sort() 对比
天天快讯:Docker 开始清退开源组织,不付费就删除所有私镜像怎么看
《暗黑破坏神4》B测神优化!N多RTX 3080 Ti惨遭黑屏变砖 暴雪:概不负责
天天新消息丨737 Max客机空难致346人丧生 波音最新表态:速度过快 乘客毫无痛苦地死去
海外爆发迄今最严峻禽流感疫情:专家详解
世界热点评!AMD终于能享受192GB内存了!连跑2小时0错误
当前热文:72.标准库类型vector
React的生命周期
关于使用AWS的CDN-CloudFront的费用计算及说明
全球即时:【财经分析】美联储连续第九次加息 抗通胀仍是主旋律
特斯拉一“咳嗽”:国内汽车行业加速洗牌了
《艾尔登法环》更新上线 终于加入了光追功能
如何知道自己怀的是男孩女孩?(如何知道自己怀的是男孩女孩)
全球最新:Styled Components 备忘清单_开发速查表分享
观热点:《艾尔登法环》光追配置需求公布:最低需RTX 3060 Ti
世界热门:48岁林志玲晒素颜近照:网友点赞笑容甜美状态好
天天日报丨DLL注入-Windows消息钩取
动态焦点:网络安全(中职组)-B模块:Web渗透测试
微信小程序原生AI运动(动作)检测识别解决方案
每日热闻!美联储表态已现温和迹象 市场仍存下半年降息“奢望”
天天最资讯丨中国人民大学苏州校区专业有哪些专业_中国人民大学苏州校区怎么样
焦点热讯:净利润翻倍超18亿元 爱玛电动车业绩大增送出股权激励
天天热点!1799元一台顶三台!小米米家无线洗地机2 Lite预售:吸拖洗都行
每日快看:蔚来CFO评价中国车企价格战:中国车企太多了
【快播报】私拉线路充电致17辆电动自行车被烧毁:科普飞线充电危害
今日要闻!华硕ROG新款XG Mobile显卡坞上市:搭载RTX 4090移动版 售价超2万
Vue 核心(一)
从零开始搞一个androidApp,实现h5自动更新、jsbridge
快资讯:“星月童话”来了!月掩金星天象明晚亮相:错过要等3年
天天百事通!女生疑在奶茶中喝出10余颗玻璃珠:店家回应
视点!黄金定价模式生变背后:央行们正失去对货币环境的控制
泉水煮蛋怎么做
记录--你还在傻傻的npm run serve吗?快来尝尝这个!
CloudQuery 社区重启 | 愿归来仍是少年
ChatGPT为我们带来了什么?
.net core 关于对swagger的UI(Index.html)或接口的权限验证;
每日头条!oracle学习之路(5)Navicat连接Oracle数据库:Oracle library is not loaded 解决方案
世界快资讯丨美联储鸽派声明缓解日本央行政策压力 日债收益率多数下跌
瑞士央行加息50个基点至1.50% 不排除进一步加息可能
全球短讯!常用消毒剂无效 致命真菌在美国蔓延:近半感染者90天内死亡
《龙马精神》推广曲《真心英雄》MV出炉:成龙郭麒麟重唱经典
环球聚焦:二手路虎变法拉利!男子80万买到泡水路虎 车商被判退一赔三
天天播报:CSAPP-Bomb Lab
全球快资讯丨Python工具箱系列(二十九)
视焦点讯!让业务容器化更安全便捷,阿里云容器镜像服务 ACR 推出免费制品中心
环球热点评!云服务器部署AI绘图记录
全球热资讯!pdf.js 使用
今日要闻!尿道结石怎么治疗才能除病根_尿道结石该怎么治疗
虚幻引擎5推出重磅新功能MetaHuman Animator:实现真人面部动作高速模拟
焦点速看:开放世界元宇宙游戏《仙剑世界》来了:万物皆可交互
焦点短讯!中华老字号!西安饭庄糕点礼盒19.9元冲量大促:一次买16枚
两女子高速上突然跳车:闻到汽油味、以为要爆炸
环球实时:阿里又开源一款数据同步工具 DataX,稳定又高效,好用到爆!
一周的时间搞一个疫苗预约系统
环球热消息:Apache Kafka JNDI注入(CVE-2023-25194)漏洞复现浅析
快讯:河北沧州2022年成人高考成绩查询入口已开通
当前时讯:【新华500】新华500指数(989001)23日低开高走涨0.88%
今日观点!女生10年收集万瓶香水价值一套房:圈粉超47万
世界热文:捐100亿元建世界一流名校 曹德旺:大学没有教会年轻人动手能力
【天天快播报】汽车疯狂降价潮引担忧:狂欢之后会不会是淘汰潮?
热推荐:【操作系统】面试题总结(持更)
天天简讯:权值(点分治)
当前速看:JavaScript学习笔记
环球最资讯丨WMS深入浅出
环球关注:剑指 Offer 17. 打印从 1 到最大的 n 位数(java解题)
环球观焦点:Intel 56核心刚出生就落伍!AMD Zen4撕裂者下半年来袭:96核心
【新视野】力压美国印度!中国富豪全球第一:钟睒睒蝉联首富 马化腾张一鸣紧随其后
石榴汁弄衣服上怎么洗才能不会变干(石榴汁弄衣服上怎么洗)
环球最资讯丨机箱中的海景房 乔思伯TK-1双曲面侧透游戏机箱579元:颜值爆表
成都比亚迪、特斯拉、宝马三车相撞 特斯拉和宝马车轮飞了
天天简讯:Go语言:利用 TDD 逐步为一个字典应用创建完整的 CRUD API
【世界播资讯】springcloud Stream整合rabbitmq消息驱动生产者踩坑
【天天报资讯】Vue之移动端viewport-vw适配
LevelDb-用户接口
世界视讯!Spring Cloud Alibaba微服务搭建(二)- 安装mysql
【世界速看料】新能源汽车充电时为何要交停车费 专家:可防止充电之后不挪窝
当前热点-全球首枚3D打印火箭!美国“人族一号”发射失败
明年底有望普及!PCIe 5.0 SSD尴尬了 买的人太少:性能残血、价格死贵
我和你本应该各自好各自坏是什么歌?我和你本应该各自好各自坏歌词
mirror男团中谁的人气最高?mirror男团年龄排序
亡羊补牢的亡是什么意思?亡羊补牢成语故事
班主任管理班级的策略与措施是什么?班主任教育随笔示范
《最终幻想16》新片段 宠物可以防止你迷路
看点:MS SQL服务器教程_编程入门自学教程_菜鸟教程-免费教程分享
卿卿日常李薇的真实身份是什么?卿卿日常郝葭死了吗?
质感旗舰!真我GT Neo5 SE未来感十足:纳米级光哑熔合工艺打造
女子不敢在隧道开车 交给无证男子驾驶 听到后果惊恐万分
196元暴涨至1910元 民宿回应五一价格翻十倍:先挂着 随时调整
最资讯丨专盯未成年?女孩添加“爱豆”QQ后被骗贷款3万4
连鸽两次 世界首枚3D打印火箭将再发射:这回能顺利吗?
全球热点!Python工具箱系列(二十八)
天天通讯!不知道
酝酿产智融合“化学反应” 浙江衢州集中签约多家研究院
天天日报丨“帝王座驾、以辇为尊” 比亚迪云辇系统官宣:或为底盘新技术
天天热文:早午餐合成一顿?医生提醒:细胞营养需求加大 更易长胖
即时看!警惕!义乌一女子险被电商“客服”骗走800万
当前观点:配可滑动中控屏、宾利同款B柱挂钩!极氪X内饰官图发布
每日看点!【数论与组合数学 3】Hensel 引理、原根
世界观察:Android使用SurfaceView实现签名板