STL学习-排序算法

1.sort

使用快速排序,平均性能好O(nlogn),但最差情况可能很差O(n^2)。不稳定。

sort(v.begin(),v.end());//对v容器进行排序,默认升序
sort(v.begin(),v.end(),greater<int>());//降序排序

2.partial_sort

使用堆排序,平均性能和最差都是O(nlogn),但实际情况比sort慢。不过partial sort可以对容器的一部分数据排序。不稳定。

template<class RandomAccessIterator>
void partial_sort(
RandomAccessIterator first,
RandomAccessIterator sortEnd,
RandomAccessIterator last
);

三个参数的含义:

第一个参数:开始迭代器

第二个参数:堆排序结束迭代器,它距离第一个参数的距离就是得到有序数据的个数

第三个参数:元素范围结束迭代器

注意第二个参数,它的含义类似于得到前多个有序的数字

partial_sort(v.begin(),v.begin()+5,v.end());//对前5个数据排序
partial_sort(v.begin(),v.end,v.end());//对所有数据排序
partial_sort(v.begin(),v.end,v.end(),greater<int>());//降序排序

此函数使用较为复杂,具体如下:

#include<algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>v1{3,1,7,6,9,2,1,5,78,23};
vector<int> v2;
cout<<"排序前:";Show(v1);
v2 = v1;
partial_sort(v2.begin(),v2.begin()+5,v2.end());//在全部数据中排出前5
cout<<"排出全部数据的前5:";Show(v2);
v2 = v1;//重新赋值
partial_sort(v2.begin(),v2.begin()+ 5,v2.begin()+ 5);//注意最后一个参数,不是end
cout<<"只对前5个排序后:";Show(v2);
v2 = v1;//重新赋值
partial_sort(v2.begin(),v2.end(),v2.end());
cout<<"全部排序后:";Show(v2);
v2 = v1://重新赋值
partial_sort(v2.begin()+5,v2.end(),v2.end());//前5个数据不排序
cout<<"前5个数据不排序:";Show(v2);
return 0;
}

注意:对前五个排序,是把整个容器最小的前五个数据放在前面

3.satble_sort

稳定的排序,采用的是归并排序,O(logn),但是空间复杂度大

stable_sort(v.begin(),v.end());//默认升序
stable_sort(v2.begin(),v2.end(),greater<int>());//降序排序

测试三种排序的时间差:

#include<algorithm>
#include <iostream>
#include <vector>
#include<numeric>
#include <random>
#include <ctime>
using namespace std;
//输出vector的所有元素
template<typename T>
void Show(const vector<T>& v)
{
for(auto x:v)
cout << x<<" ";
cout<< endl;
}
int main()
{
const int n= 10000000;
default_random_engine engine;//默认随机引擎
//default_random_engine engine(time(NULL));//加上随机种子
uniform_int_distribution<unsigned int> di(0,10000008);//随机数范围,
//for(inti=0:i<10:++i)//产生10个随机数
//t
//cout<< di(engine)<<"";
//}
//cout << endl;
vector<int>v1,v2,v3;
int tmp;
for(int i=0;i<n;i++)
{
tmp = di(engine);//产生一个随机数
v1.push back(tmp);
}
v2 = v1;
v3 = v1;
clockt c1=clock();
sort(v1.begin(),v1.end());
clockt_c2=clock();
cout<<n<<"个数字sort排序,时间为"<<c2 - c1 <<"毫秒"<<endl;
c1 = clock();
stable_sort(v2.begin(),v2.end());
c2= clock();
cout<<n<<"个数字stable sort排序,时间为"<<c2 - c1<<"毫秒"<<endl;

c1 = clock();
partial_sort(v3.begin(),v3.end(),v3.end());
c2= clock();
cout<<n<<"个数字partial sort排序,时间为"<<c2 - c1〈<"毫秒"<<endl;
//验证排序结果正确
/*Show(v1);
Show(v2);
Show(v3);*/
return 0;
}

结果为:

对一千万的数据量进行排序时间统计,结果和书本介绍差别较大<C++标准库 第2版>512页。在上面的结果中stable_sort(稳定的排序)反而最快。存疑。按照书上的理论sort使用快速排序应该最快,其次是partial_sort使用堆排序,最慢的是stable_sort排序。
在Ubuntu下测试结果如下:(sort最快,stable sort其次,partial sort最慢)

总结:这三个排序的性能测试不具备可移植性。没有特殊要求的一般情况请使用sort,如果需要稳定的排序请使用stable_sort。如果只想得到部分有序的数据请使用partial_sort。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/913813.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WSL 2 中 FastReport 与 FastCube 的设置方法与优化策略

软件开发人员长期以来一直在思考这个问题&#xff1a;“我们如何才能直接在 Windows 中运行 Linux 应用程序&#xff0c;而无需使用单独的虚拟机&#xff1f;” WSL 技术为这个问题提供了一个可能的答案。WSL 的历史始于 2016 年。当时&#xff0c;其实现涉及使用 Windows 内核…

JVM的组成、字节码文件的组成

目录 java虚拟机的组成 字节码文件的组成 基础信息 常量池 字段 方法 属性 字节码相关的常用工具&#xff1a; 总结&#xff1a; 1、如何查看字节码文件&#xff1f; 2、字节码文件的核心组成有哪些&#xff1f; java虚拟机的组成 类加载器 ClassLoader运行时数据区…

李佳琦回到巅峰背后,双11成直播电商分水岭

时间倏忽而过&#xff0c;又一年的双11即将宣告结束。 从双11正式开始前的《新所有女生的offer》&#xff0c;到被作为“比价”标杆被其他平台直播间蹭、被与其他渠道品牌比较&#xff0c;再到直播间运营一时手快多发了红包……整个双11周期下来&#xff0c;李佳琦直播间在刷新…

使用iviewui组件库的坑

背景 使用view-design组件库的Input组件的时候&#xff0c;按照产品的要求&#xff0c;输入框中只能键入正整数。 使用效果 如果直接使用组件的type属性&#xff0c;设置类型为number时&#xff0c;乍一看没啥问题&#xff0c;但是当我们键入 小数点(.) 或者 e/E 后面没有跟任…

软件测试学习记录 Day1

根据黑马程序员最新版的软件测试课程所做的笔记&#xff0c;需要原件后台私信&#xff1a; 练习提取测试点&#xff1a; 博主的答案&#xff0c;有不一样看法的可评论区讨论&#xff1a;

uni-app选项卡制作 ⑥

文章目录 十、选项卡制作一 、组件创建二、scroll-view 组件使用三、点击设置按钮跳转到标签设置界面四、数据获取 十、选项卡制作 1.遇到错误&#xff1a; 2.解决问题&#xff1a; 3.this 指向问题 // 指向&#xff1a; get_label_list uniCloud.callFunction({name: "g…

最新x64dbg软件

最新x64dbg软件 1、简介2、调试程序界面3、开源官网 1、简介 最新x64dbg软件-比OD更好的工具&#xff0c;原生支持中文界面和插件。 x64dbg是一款专业的windows系统下的64位调试器&#xff0c;界面简洁、操作简单&#xff0c;与 “OllyDbg” 调试工具非常相似&#xff0c;如果…

【时间之外】IT人求职和创业应知【31】

目录 新闻一&#xff1a;2024年“秦创原沣东杯”陕西省科技工作者创新创业大赛颁奖仪式暨沣东新城机器人产业发展大会盛大启幕 新闻二&#xff1a;声网CEO赵斌&#xff1a;RTE将成为生成式AI时代AI Infra的关键部分 新闻三&#xff1a;“5G工业互联网”融合应用试点城市名单…

Docker使用docker-compose一键部署nacos、Mysql、redis

下面是一个简单的例子&#xff0c;展示如何通过Docker Compose文件部署Nacos、MySQL和Redis。请确保您的机器上已经安装了Docker和Docker Compose。 1&#xff0c;准备好mysql、redis、nacos镜像 sudo docker pull mysql:8 && sudo docker pull redis:7.2 &&…

04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索

文章目录 深入 Oracle 并发世界&#xff1a;MVCC、锁、闩锁、事务隔离与并发性能优化的探索一、多版本并发控制&#xff08;MVCC&#xff09;1.1 理论解析1.2 实践应用 二、锁与闩锁机制2.1 理论解析2.2 实践应用 三、事务隔离级别3.1 理论解析3.2 实践应用 四、死锁预防与解决…

PyQt5超详细教程终篇

PyQt5超详细教程 前言 接&#xff1a; [【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;](【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;-CSDN博客) 建议把代码复制到pycahrm等IDE上面看实际效果&#xff0c;方便理…

计算机的错误计算(一百五十一)

摘要 探讨 MATLAB 中反正弦 asin 与反余弦 acos 函数的计算精度问题。 例1. 已知 计算 及 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 0.1570785896071048e1、0.1043072384837152e-4、-0.1570785896071048e1 与 0.3141582222865945e1&#xff08;I…

FPGA学习笔记#5 Vitis HLS For循环的优化(1)

本笔记使用的Vitis HLS版本为2022.2&#xff0c;在windows11下运行&#xff0c;仿真part为xcku15p_CIV-ffva1156-2LV-e&#xff0c;主要根据教程&#xff1a;跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习 从这一篇开始正式进入HLS对C代码的优化笔记 学习笔记&#xff1a;《…

Spring Plugin与策略模式:打造动态可扩展的应用

目录 一、策略模式 二、Spring Plugin 2.1 Spring Plugin 实现策略模式开发 2.2 策略模式优缺点 三、Spring Plugin 原理 一、策略模式 策略模式是一种设计模式&#xff0c;它允许程序在运行中动态的选择不同的行为方式进行动态执行。策略模式的核心思想是将行为封装在一个个…

Works With线上开发者大会将提供物联网行业深入的专业知识和技能

Silicon Labs2024年Works With线上开发者大会定于11月20日至21日举行&#xff0c;将汇集全球各地的物联网开发人员、设备制造商、无线技术专家、工程师和商业领袖&#xff0c;观众可免费注册参加。同时&#xff0c;为了方便中文观众&#xff0c;所有在线视频均配有中文字幕。 芯…

一文读懂 Web 安全

Web 安全是互联网中不可或缺的一个领域&#xff0c;这个领域中诞生了大量的黑帽子与白帽子&#xff0c;他们都是安全领域的王者&#xff0c;在平时里&#xff0c;他们利用各种巧妙的技术互相博弈&#xff0c;时不时就会掀起一场 Web 安全浪潮&#xff0c;真可谓神仙打架&#x…

iOS问题记录 - 503 Service Temporarily Unavailable

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 最近有个项目经历了大改动&#xff0c;本地测试没什么问题&#xff0c;于是准备通过打包机打包用于内部测试的包&#xff0c;然后问题就来了。 开发环境 Xcode: 16.1Fastlane: 2.219.0 问题描述 问题出在登录苹果…

数据网格能替代数据仓库吗?

一、数据网格是什么&#xff1f; 数据网格&#xff1a;是一种新兴的数据管理架构和理念&#xff0c;主要用于解决大规模、复杂数据环境下的数据管理和利用问题。 核心概念&#xff1a; 1、数据即产品&#xff1a;将数据看作一种产品&#xff0c;每个数据域都要对其生产的数据负…

Dolphinscheduler配置dataX离线采集任务写入hive实践(二)

这里写目录标题 一、 写入hive 配置1.1 权限报错信息 &#xff1a;1.2 hive 中文件格式1.3 注意区别以下建表语句A、构建ORC 格式分区表B. 构建默认文件格式分区表C.构建非分区表 二、dataX 配置hive 分区表导入 配置2.1 检查hive 表分区是否存在 一、 写入hive 配置 dataX 写…

机器学习——损失函数、代价函数、KL散度

&#x1f33a;历史文章列表&#x1f33a; 机器学习——损失函数、代价函数、KL散度机器学习——特征工程、正则化、强化学习机器学习——常见算法汇总机器学习——感知机、MLP、SVM机器学习——KNN机器学习——贝叶斯机器学习——决策树机器学习——随机森林、Bagging、Boostin…