【C++ STL算法】sort 排序

news2024/11/28 2:53:19

文章目录

  • 【 1. 基本原理 】
  • 【 2. sort 的应用 】
    • 实例 - sort 函数实现 升序排序和降序排序

函数名用法
sort (first, last)基于 快速排序,对容器或普通数组中 [ first, last ) 范围内的元素进行排序,默认进行升序排序从小到大)。
stable_sort (first, last)和 sort() 函数功能相似,不同之处在于,对于 [first, last) 范围内值相同的元素,该函数不会改变它们的相对位置。
partial_sort (first, middle, last)从 [first,last) 范围内,筛选出 muddle-first 个最小的元素并排序存放在 [first,middle) 区间中。
partial_sort_copy (first, last, result_first, result_last)从 [first, last) 范围内筛选出 result_last-result_first 个元素排序并存储到 [result_first, result_last) 指定的范围中。
is_sorted (first, last)检测 [first, last) 范围内是否已经排好序,默认检测是否按升序排序。
is_sorted_until (first, last)和 is_sorted() 函数功能类似,唯一的区别在于,如果 [first, last) 范围的元素没有排好序,则该函数会返回一个指向首个不遵循排序规则的元素的迭代器。
void nth_element (first, nth, last)找到 [first, last) 范围内按照排序规则(默认按照升序排序)应该位于第 nth 个位置处的元素,并将其放置到此位置。同时使该位置左侧的所有元素都比其存放的元素小,该位置右侧的所有元素都比其存放的元素大。

【 1. 基本原理 】

  • sort() 函数位于 <algorithm>头文件 中。
  • sort() 函数 的适用条件
    sort() 函数受到底层实现方式的限制,它仅适用于普通数组和部分类型的容器。换句话说,只有普通数组和具备以下条件的容器,才能使用 sort() 函数:
    • 容器支持的迭代器类型必须为随机访问迭代器。这意味着,sort() 只对 array、vector、deque 这 3 个容器提供支持。
    • 如果对容器中指定区域的元素做默认升序排序,则元素类型必须支持 < 小于运算符;同样,如果选用标准库提供的其它排序规则,元素类型也必须支持该排序规则底层实现所用的比较运算符
    • 如果sort() 函数在实现 排序时,需要交换容器中元素的存储位置。这种情况下,如果容器中存储的是自定义的类对象,则该 类的内部必须提供移动构造函数和移动赋值运算符
  • 对于指定区域内 值相等的元素,sort() 函数 无法保证它们的相对位置不发生改变。例如,有如下一组数据:
    2 1 2 3 2
    可以看到,该组数据中包含多个值为 2 的元素。此时如果使用 sort() 函数进行排序,则值为 2 的这 3 个元素的相对位置可能会发生改变,排序结果为:
    1 2 2 2 3
    可以看到,原本红色的元素 2 位于绿色 2 和黑色 2 的左侧,但经过 sort() 函数排序之后,它们的相对位置发生了改变,即红色 2 移动到了绿色 2 和黑色 2 的右侧。
  • 实际场景中,如果需要 保证值相等元素的相对位置不发生改变,可以选用 stable_sort() 排序函数。
  • sort 的执行效率
    sort() 函数的效率怎么样吗?该函数实现排序的 平均时间复杂度为 N l o g 2 N Nlog_2N Nlog2N(其中 N 为指定区域 [first, last) 中 last 和 first 的距离)。

【 2. sort 的应用 】

  • C++ STL 标准库中的 sort() 函数,本质就是一个模板函数,该函数专门用来对容器或普通数组中指定范围内的元素进行升序排序,除此之外我们也可以选择标准库提供的其它排序规则(比如std::greater<T>降序排序规则),甚至还可以自定义排序规则。
    • first 和 last 都为随机访问迭代器,它们的组合 [first, last) 用来指定要排序的目标区域;另外在第 2 种格式中,comp 可以是 C++ STL 标准库提供的排序规则(比如 std::greater<T>),也可以是自定义的排序规则。
  • 对 [first, last) 区域内的元素做默认的升序排序
void sort (RandomAccessIterator first, RandomAccessIterator last);
  • 按照指定的 降序排序规则,对 [first, last) 区域内的元素进行排序。
void sort (RandomAccessIterator first, RandomAccessIterator last, greater<int>() );

实例 - sort 函数实现 升序排序和降序排序

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() 
{
    vector<int> myvector{ 32, 71, 12, 45, 26, 80, 53, 33 };
    //升序排序(默认)
    sort(myvector.begin(), myvector.begin() + 4); //(12 32 45 71) 26 80 53 33
    for (vector<int>::iterator it = myvector.begin(); it != myvector.begin() + 4; ++it) {
        cout << *it << ' ';
    }
    cout << endl;
    
    //降序排序(指定)
    sort(myvector.begin(), myvector.begin() + 4, greater<int>()); //(71 45 32 12) 26 80 53 33
    for (vector<int>::iterator it = myvector.begin(); it != myvector.begin() + 4; ++it) {
        cout << *it << ' ';
    }
    return 0;
}

在这里插入图片描述

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

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

相关文章

vscode-tasks.json自定义任务

以下所有内容,参考自VScode官方文档: vscode_tasks-docs任务说明文档vscode_variables-reference-docs变量说明文档vscode addtional docs for tasksvscode launch.json 属性设置文档,(下文没有介绍,没有涉及) 浅浅记录一下个人对vscode任务(task)的理解,还谈不上使用. 文章目…

TouchGFX之时钟

代码 #ifndef TOUCHGFX_ABSTRACTCLOCK_HPP #define TOUCHGFX_ABSTRACTCLOCK_HPP #include <touchgfx/containers/Container.hpp> #include <touchgfx/hal/Types.hpp>namespace touchgfx { class AbstractClock : public Container { public:AbstractClock();/* 设…

【IMU系列】什么是传感器的ODR和FSR实际如何配置传感器

使用更高的ODR信号有两个主要缺点&#xff1a;内存限制和功耗 以实际传感器为例

Redis分布式锁误删情况说明

4.4 Redis分布式锁误删情况说明 逻辑说明&#xff1a; 持有锁的线程在锁的内部出现了阻塞&#xff0c;导致他的锁自动释放&#xff0c;这时其他线程&#xff0c;线程2来尝试获得锁&#xff0c;就拿到了这把锁&#xff0c;然后线程2在持有锁执行过程中&#xff0c;线程1反应过…

成都正信晟锦:借了钱不还怎么起诉对方

在民间借贷中&#xff0c;遇到对方借钱不还的情况时&#xff0c;可以依法通过起诉的方式解决纠纷。首先&#xff0c;债权人应与债务人进行沟通&#xff0c;尝试和解。如果协商无果&#xff0c;则需收集证据&#xff0c;包括但不限于借条、转账记录、双方通讯记录等&#xff0c;…

mysql忘记密码如何重置

错误截图 解决方法 1. 关闭mysql服务器 net stop mysql服务名 2. 查找mysql安装路径中bin目录路径 3. cmd 打开该目录 4. 在my.ini所在的目录&#xff0c;新建一个init_pwd.txt文件。文件内容如下 ALTER user rootlocalhost identified by 密码; 5. 在第四步打开的cmd中 输…

vscode的基本使用(简洁版)

1.Vscode配置C/C开发环境 1.1 下载编译器 MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 下载并解压 -> 放到电脑C盘的根目录下 1.2 配置环境变量 1.3 安装C/C插件 2. 在VScode上编写C语言代码并编译成功 在vscode中写代码时,需要将代码放在…

在Idea里,执行npm命令 : 无法加载文件 ***\Nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

重建大师进行扫码认证了,接下来怎样才能正常使用?(如下图)

重建大师软件授权已经有了后&#xff0c;新建工程后设置任务目录和监控目录一致就可以运行了。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像控点&#xff0c;输出高精度彩色网格…

Tiktok矩阵系统是什么?——Tiktok矩阵系统的优势、功能、及应用场景的介绍

摘要 Tiktok作为全球现象级的短视频平台,其发展前景日益明朗。 Tiktok全世界有多少用户? TikTok作为全球性的社交媒体平台,其用户数量一直在持续增长。根据最新的数据,预计到2024年,TikTok的用户数量将达到数十亿,覆盖全球范围内的各个年龄段和地区。具体来说,根据Ti…

互质数的个数(acwing)

题目描述&#xff1a; 给定 a,b&#xff0c;求 1≤x<a^b 中有多少个 x 与 a^b 互质。 由于答案可能很大&#xff0c;你只需要输出答案对 998244353 取模的结果。 输入格式&#xff1a; 输入一行包含两个整数分别表示 a,b&#xff0c;用一个空格分隔。 输出格式&#xf…

W25QXX系列W25Q64介绍

文章目录 前言介绍W25Q系列硬件电路四重SPI&#xff08;了解&#xff09; 框图Flash操作注意状态寄存器指令集电器特性 前言 W25Q64是一个8MByte大小的非易失性存储器&#xff0c;使用的是SPI协议&#xff0c;本文将全面介绍W25Q64的特性、工作原理以及注意事项 SPI详解见&am…

30万奖金谁能瓜分?OurBMC开源大赛决赛入围名单公示

首届开放原子开源大赛基础软件赛道自今年 1 月开启报名以来&#xff0c;吸引了全国各地 BMC 技术爱好者的广泛关注和踊跃报名。该赛事由开放原子开源基金会牵头&#xff0c; OurBMC 社区及理事长单位飞腾信息技术有限公司联合承办&#xff0c;以 “基于 BMC 技术的服务器故障诊…

CSS导读 (Emmet语法)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 续&#xff1a;七、Chrome调试工具 一、Emmet语法 1.1 快速生成HTML结构语法 1.2 快速生成CSS样式语法 &…

ctfshow web入门 php特性 web108--web115

web108 ereg函数相当于而preg_match()函数 ereg函数的漏洞&#xff1a;00截断。%00截断及遇到%00则默认为字符串的结束 strrev函数就是把字符串倒过来 就是说intval处理倒过来的传参c0x36d&#xff08;877&#xff09;?ca%00778 web109 异常处理类 通过异常处理类Excepti…

DFS-0与异或问题,有奖问答,飞机降落

代码和解析 #include<bits/stdc.h> using namespace std; int a[5][5]{{1,0,1,0,1}}; //记录图中圆圈内的值&#xff0c;并初始化第1行 int gate[11]; //记录10个逻辑门的一种排列 int ans; //答案 int logic(int x, int y, int op){…

3D引擎八叉树构建算法实现

最近&#xff0c;我一直在努力研究我的3D引擎Storm3D。 我花费大量时间的功能之一是开发一种通用且高效的八叉树数据结构&#xff0c;它将用于从碰撞检测到基于体素的渲染等多种用途。 在这里我将介绍构建八叉树的基本算法以及你可能遇到的一些障碍。 NSDT工具推荐&#xff1a;…

实习该选择c++后台开发(写业务逻辑)还是音视频开发(写sdk)?

后台开发:更多是理解需求、分析问题、解决bug等能力、对于逻辑培养有很大的帮助。可以进行软件开发、网络开发、游戏开发、以及之后可能的物联网相关开发。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「音视频开发的资料从专业入门到高级教程」&#…

光伏电站投资与收益能成正比吗?

光伏电站作为绿色能源的代表&#xff0c;近年来在全球范围内得到了广泛的关注和应用。然而&#xff0c;光伏电站的投资与收益是否能成正比&#xff0c;始终是投资者和市场关注的焦点。本文将就此问题进行深入探讨。 首先&#xff0c;我们必须明确光伏电站的投资与收益并非简单的…

黑马Seata入门到实战教程(学习笔记)

Seata CAP理论 BASE理论 XA AT TCC sage模式 缺点&#xff1a;数据隔离性安全问题 四种模式对比