C++STL--排序算法

在这里插入图片描述

sort

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

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

对于支持随机访问的迭代器的容器, 都可以利用sort算法直接对其进行排序

下面对deque容器进行排序:

void printDeque(const deque<int>& d)
{//1.迭代器for (auto i = d.begin();i != d.end();i++)cout << *i << " ";cout << endl;//范围for/*for (auto i : d)cout << i << " ";cout << endl;*/
}
int main()
{deque<int>d{ 12,3,5,6,2,4 };	cout << "排序前的deque是: ";printDeque(d);//sort(d.begin(), d.end()); //默认是升序//对于支持随机访问的迭代器的容器, 都可以利用sort算法直接对其进行排序	sort(d.begin(), d.end(), greater<int>()); //降序 需要加一个greater<int>()cout << "排序后的deque是: ";printDeque(d);
}

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());//在全部数据中排出前5cout << "排出全部数据的前5:"; Show(v2);v2 = v1;//重新赋值partial_sort(v2.begin(), v2.begin() + 5, v2.begin() + 5);//注意最后一个参数,不是endcout << "只对前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;
}

注意:

  • 对前5个排序,实际是把整个容器最小的5个数据放到最前面。

    对前5个不排序,就真的没有排序前5个。

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

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, 10000000);//随机数范围,可以不写默认就是提供的类型范围//for (int i = 0; i < 10; ++i) //产生10个随机数//{//  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;clock_t c1 = clock();sort(v1.begin(), v1.end());clock_t 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排序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的师生交流平台

目录 背景 技术简介 系统简介 界面预览 背景 传统的师生互动平台主要依赖于面对面的线下交流&#xff0c;用户必须亲自到场以获取和交流相关信息。然而&#xff0c;随着信息技术的广泛传播&#xff0c;众多教育机构开始转向线上发展&#xff0c;寻求更多样化的发展途径。线…

C++11:声明 初始化

C11&#xff1a;声明 & 初始化 初始化{ }初始化initializer_list 声明autodecltypenullptr 初始化 { }初始化 在C98中&#xff0c;允许使用花括号{ }对数组或者结构体元素进行统一的列表初始化。 用{ }初始化数组&#xff1a; int arr[] { 1, 2, 3, 4, 5 };用{ }初始化…

详解2024年阿里云服务器租用价格表,最新报价

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

C++中的List容器用法详解

文章目录 C中的List容器用法详解List 的特点List 的重要接口用法介绍1.创建和初始化Listlist 2.插入元素push_backpush_forntinsert 删除元素pop_backpop_fontclearerase 遍历List迭代器遍历范围for遍历 排序Listsort 反转Listreverse 转移Listsplice 去重unique 合并merge 总结…

网站可扩展架构设计——中台

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、中台简介 1.传统项目架构的痛点 (1)重复造轮子 各项目相对独立&#xff0c;许多项目在重复造轮子&#xff0c;让项目本身越来越臃肿&#xf…

[Leetcode笔记] 动态规划相关

前言 写题目写到了一些和动态规划相关的内容&#xff0c;所以在这里记录一下 LCR 089 题解思路 总的来说&#xff0c;就是用一个数组去存储当前的最优解&#xff0c;然后从0开始一路向上顺推过去&#xff0c;求得最后一位的最优解。 class Solution { public:int rob(vect…

检测头篇 | 利用RT-DETR模型的检测头去替换YOLOv8中的检测头

前言:Hello大家好,我是小哥谈。RT-DETR号称是打败YOLO的检测模型,其作为一种基于Transformer的检测方法,相较于传统的基于卷积的检测方法,提供了更为全面和深入的特征理解,将RT-DETR检测头融入YOLOv8,我们可以结合YOLO的实时检测能力和RT-DETR的深度特征理解能力,打造出…

VLAN基础讲解+不同VLAN间通信(实验)

第一章 VLAN基础 1.1 什么是VLAN 随着网络中计算机的数量越来越多&#xff0c;传统的以太网络开始面临广播泛滥以及安全性无法保证等各种问题。 VLAN即虚拟局域网&#xff0c;是将一个物理的局域网在逻辑上划分成多个广播域的技术。通过在交换机上配置VLAN&a…

基于深度学习的吸烟检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5等深度学习模型的吸烟行为检测系统&#xff0c;核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及…

从0配置React

在本地安装和配置React项目&#xff0c;您可以使用create-react-app这个官方推荐的脚手架工具。以下是安装React的步骤&#xff0c;包括安装Node.js、使用create-react-app创建React应用&#xff0c;以及启动开发服务器。 下载安装node.js运行以下命令&#xff0c;验证Node.js…

【Qt 学习笔记】Qt 开发环境的搭建 | Qt 安装教程

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 开发环境的搭建 | Qt 安装教程 文章编号&#xff1a;Qt 学习笔记 /…

外贸建站:WordPress搭建外贸独立站零基础自建站完整教程(2024)

对于做外贸来说&#xff0c;拥有自己的外贸独立网站真的非常重要。在外贸领域&#xff0c;如今各平台竞争激烈&#xff0c;规则多&#xff0c;成本高&#xff0c;价格战、政策变化快&#xff0c;还存在封店风险等等因素。在这种情况下&#xff0c;拥有外贸独立站就能很好规避上…

攻防世界[EASYHOOK]

阅读须知&#xff1a; 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者 本人负责&#xff0c;作者不为此承担任何责任,如…

STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (b)

继续上篇博文&#xff1a;STM32学习和实践笔记&#xff08;4&#xff09;: 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)-CSDN博客 往下写&#xff0c; 为什么&#xff1a;当GPIO_InitStructure.GPIO_PinGPIO_Pin_0 ; 时&#xff0c;其实就是将对应的该引脚的寄存器地…

Xxxxxx

数据库 1&#xff0c;B树与B树区别 1&#xff0c;B树每个节点存ID与其他数据字段&#xff0c;B非叶子结点&#xff0c;只存ID&#xff0c;叶子结点存完整数据 好处&#xff1a;每个层级B树&#xff0c;可以存储更多的额数据&#xff0c;层级更少&#xff0c;更扁平&#xff…

【语义分割实战(1)】U-Net语义分割:训练自己的数据集

一、U-Net图像语义分割原理 UNet最早发表在2015的MICCAI会议上&#xff0c;4年多的时间&#xff0c;论文引用量已经达到了9700多次。 UNet成为了大多做医疗影像语义分割任务的baseline&#xff0c;同时也启发了大量研究者对于U型网络结构的研究&#xff0c;发表了一批基于UNet…

Java中线程详解

文章目录 相关概念多线程概念实现方式继承Thread类实现Runnable接口比较 常用方法线程安全产生的原因解决思想同步同步代码块同步方法Lock锁机制 死锁概念避免 状态线程间的通讯介绍方法 相关概念 并行&#xff1a;在同一时刻&#xff0c;有多个任务在多个CPU上同时执行并发&a…

抖店新手从0-1起店教程:新手开抖店别乱操作!这才是正确流程!

哈喽~我是电商月月 新手开抖店为什么不好成功&#xff0c;那是因为你没接触过电商&#xff0c;不懂其中的步骤&#xff0c;一些细节没处理好&#xff0c;开店就已经注定失败&#xff01; 废话不多说&#xff0c;直接入正题 一&#xff0e;开店&#xff0c;入驻抖店 1&#…

韩顺平 | 零基础快速学Python

环境准备 开发工具&#xff1a;IDLE、Pycharm、Sublime Text、Eric 、文本编辑器&#xff08;记事本/editplus/notepad&#xff09; Python特点&#xff1a;既支持面向过程OOP、也支持面向对象编程&#xff1b;具有解释性&#xff0c;不需要编程二进制代码&#xff0c;可以直…

算法沉淀——动态规划篇(子数组系列问题(上))

算法沉淀——动态规划篇&#xff08;子数组系列问题&#xff08;上&#xff09;&#xff09; 前言一、最大子数组和二、环形子数组的最大和三、乘积最大子数组四、乘积为正数的最长子数组长度 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都…