【C++ STL算法】sort 排序

文章目录

  • 【 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;
}

在这里插入图片描述

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

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

相关文章

在linux上面安装nexus私有maven库

问题 需要在EC2机器上面安装私有maven库。 步骤 更新OS sudo yum update -yJDK11 # 安装JDK11 sudo yum install java-11-amazon-corretto # 查询jdk11位置 sudo alternatives --config java内容如下&#xff1a; There are 2 programs which provide java.Selection …

用动态IP采集数据总是掉线是为什么?该怎么解决?

动态IP可以说是做爬虫、采集数据、搜集热门商品信息中必备的代理工具&#xff0c;但在爬虫的使用中&#xff0c;总是会遇到动态IP掉线的情况&#xff0c;从而影响使用效率&#xff0c;本文将探讨动态IP代理掉线的几种常见原因&#xff0c;并提供解决方法&#xff0c;以帮助大家…

libVLC 提取视频帧使用OpenGL渲染

在上一节中&#xff0c;我们讲解了如何使用QWidget渲染每一帧视频数据。 由于我们不停的生成的是QImage对象&#xff0c;因此对 CPU 负荷较高。其实在绘制这块我们可以使用 OpenGL去绘制&#xff0c;利用 GPU 减轻 CPU 计算负荷&#xff0c;本节讲解使用OpenGL来绘制每一帧视频…

ctfshow web入门 php特性 web108--web115

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

国外动态住宅IP代理的五大优势

在当前的数字时代&#xff0c;随着网络监控和地理限制的日益增强&#xff0c;国外动态住宅IP代理成为了解决这些问题的关键工具。它不仅能够保护用户的个人隐私&#xff0c;提供高度的匿名性&#xff0c;还能轻松突破访问限制&#xff0c;让全球的内容触手可及。对于数据科学家…

Vue+OpenLayers7入门到实战:OpenLayers加载WFS服务的要素资源数据并叠加到地图上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章讲解如何使用OpenLayers6加载WFS服务的要素资源数据并叠加到地图上的功能。 WFS规范介绍 WFS是基于地理要素级别的数据共享和数据操作,WFS规范定义了若干基于地理要素(Feature)级别的数据操作接口…

PL2303HXA自2012已停产,请联系供货商的解决方法

一、概述 Win10不支持PL2303HXA usb串口&#xff0c;当管理员做配置的时候发现无法查看端口信息&#xff0c;设备管理器提示&#xff1a;PL2303 HXA自2012已停产&#xff0c;请联系供货商。PL2303 是Prolific 公司生产的一种高度集成的RS232-USB接口转换器&#xff0c;可提供一…

(学习日记)2024.04.10:UCOSIII第三十八节:事件实验

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

微信多账号如何聚合聊天?

看这篇文章的你是否有以下烦恼&#xff1a; 1.微信账号太多&#xff0c;每次都要拿很多手机&#xff0c;管理起来很乱 2.微信号多&#xff0c;需要很多员工来管理&#xff0c;人工费用高 3.多个微信打开后会造成微信登陆界面过多&#xff0c;切换操作十分不方便 4.当微信多…

创建型模式--4.抽象工厂模式【弗兰奇一家】

1. 奔向大海 在海贼世界中&#xff0c;位于水之都的弗兰奇一家是由铁人弗兰奇所领导的以拆船为职业的家族&#xff0c;当然了他们的逆向工程做的也很好&#xff0c;会拆船必然会造船。船是海贼们出海所必备的海上交通工具&#xff0c;它由很多的零件组成&#xff0c;从宏观上看…

【案例·增】拼接字符串,增加字符型数据记录

问题描述&#xff1a; MySQL中的数据库表存在字符型(String)字段&#xff0c;要为其拼接信息以达成数据新增&#xff0c;可以使用 SQL 中的CONCAT()、CONCAT_WS()函数来处理 案例&#xff1a; #拼接字符串 SELECT CONCAT(HELLO, World);#举例&#xff1a;student学生表。sno…

为什么多数游戏服务端是用 C++ 来写呢,是历史原因还是性能方面的考虑?

游戏服务端开发语言的选择往往受到多方面因素的影响&#xff0c;其中C被广泛应用&#xff0c;这一现象的背后既包含了历史演进的原因&#xff0c;也凸显出性能至上的技术考量。 历史沿革 自上世纪80年代起&#xff0c;C语言便以其对C语言的兼容性、面向对象的特性以及对系统资…

搞懂LLM中的Token,看这一篇就够了

一、Token是什么&#xff1f; 1.1 Token一定表示一个汉字么&#xff1f; 下面这个例子中我让ChatGPT按照Token的划分粒度将“我喜欢苹果”进行倒序输出。 这个例子说明&#xff1a;Token既可能是一个单词&#xff0c;例如“苹果”&#xff0c;也可能是一个汉字&#xff0c;例…

新版本v24.1发布,私有网盘也能创建互联网对外分享链接了

24年龙年到来之际&#xff0c;我们发布了v24.1版本&#xff0c;其中商业版优先响应了客户期待已久的外网分享特性&#xff0c;现在客户既可以创建内网登录账号可用的分享链接&#xff0c;也可以安全地创建互联网可访问的公共链接&#xff0c;产品应用场景得到了延伸。而社区版则…

T-GATE:交叉注意力使文本到图像扩散模型中的推理变得麻烦

今天给大家带来最近一项非常有意思的研究通过计算出&#xff0c;交叉注意力的输出会趋向于一个固定点。 然后在保真度提升阶段忽略文本条件不仅可以减少计算的复杂性。并提出了TGATE这种简单而无需训练的方法&#xff0c;用于高效地生成图像。 TGATE的做法是&#xff0c;一旦交…

【利器篇】前端40+精选VSCode插件,总有几个你未拥有!

前言 姊妹篇&#xff1a; 【利器篇】35精选chrome插件&#xff0c;含15前端插件&#xff0c;总有一款值得你停留 关于关于 【前端工具系列】&#xff1a; 有句话&#xff0c;事半功倍&#xff0c;其必然是借助了某些思想和工具。 VSCode是我们前端开发的武器&#xff0c;本文…

软件设计师-基础知识科目-数据结构3

三、 数据结构&#xff1a; 时间复杂度&#xff1a; 背复杂度对应的代码。Tips&#xff1a;时间复杂度估算看最内层循环&#xff0c;如若没有循环和递归则为O&#xff08;1&#xff09;。 空间复杂度&#xff1a; 需要单独空间存储数据时使用。考点&#xff1a;非递归的空间…

教你如何优雅做好项目管理?

导言 项目本身无好坏之分&#xff0c;项目管理有做好与做坏之别。在互联网大厂的体制下&#xff0c;想要做坏一个项目很难&#xff08;可以通过换人、追加资源等方式消除风险&#xff09;&#xff0c;想要做好一个项目不容易&#xff0c;需要团队及 PM 付出大量心血和精力。在…

测开面经(pytest测试案例,接口断言,多并发断言)

pytest对用户登录接口进行自动化脚本设计 a. 创建一个名为"test_login.py"的测试文件&#xff0c;编写以下测试脚本 import pytest import requests# 测试用例1&#xff1a;验证登录成功的情况 # 第一个测试用例验证登录成功的情况&#xff0c;发送有效的用户名和密…

日期时间相关的类

分界线jdk8 jdk8之前和之后分别提供了一些日期和时间的类&#xff0c;推荐使用jdk8之后的日期和时间类 Date类型 这是一个jdk8之前的类型&#xff0c;其中有很多方法已经过时了&#xff0c;选取了一些没有过时的API //jdk1.8之前的日期 Date Date date new Date(); // 从1970年…