【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 33for (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 33for (vector<int>::iterator it = myvector.begin(); it != myvector.begin() + 4; ++it) {cout << *it << ' ';}return 0;
}

在这里插入图片描述

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

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

相关文章

幸运数(蓝桥杯)

该 import java.util.*; public class Main {public static void main(String[] args) {Scanner scannew Scanner(System.in);int cnt0;for(int i1;i<100000000;i) {String si"";int lens.length();if(len%2!0) continue;int sum10; //左边int sum20; //右边fo…

CLIP模型入门

简介 CLIP&#xff08;Contrastive Language-Image Pre-Training&#xff09;是OpenAI在2021年初发布的多模态预训练神经网络模型&#xff0c;用于匹配图像和文本。该模型的关键创新之一是将图像和文本映射到统一的向量空间&#xff0c;通过对比学习的方式进行预训练&#xff…

如何给MySQL数据库的所有表统一加上字段

在开发过程中&#xff0c;有时候慢慢的建了很多数据库表&#xff0c;但是后来发现需要统一增加某些字段的时候&#xff0c;可以通过alter语句 ALTER TABLE 表名 ADD 列名 数据类型;比如我要给t_user表增加gmt_create与gmt_modified字段&#xff0c;用作记录新增记录时间与更新…

基于支持 GPT 的服务的初创公司

Kafkai&#xff1a;多语言长篇内容生成&#xff0c;AI写作的新趋势 介绍 随着生成式预训练 Transformer (GPT) 的出现&#xff0c;技术世界正在见证范式转变。 这种人工智能驱动的创新不仅仅是一种转瞬即逝的趋势&#xff0c;而是一种趋势。 它已成为科技行业的基石&#xff0c…

做海外问卷调查有什么技巧和方法?纯干货讲解

做海外问卷调查无外乎几个步骤&#xff1a;选国家、做人设、测题目、刷题目。每个步骤都有一定的技巧&#xff0c;但是它的技巧成分不是很明显。 国家的选择一般以发达国家为主&#xff0c;国家越发达问卷的数量越多&#xff0c;正常白天做题主流国家选择&#xff1a;新加坡、…

【Java EE】Spring请求如何传递参数详解

文章目录 &#x1f38d;传递单个参数&#x1f334;传递多个参数&#x1f340;传递对象&#x1f384;后端参数重命名&#xff08;后端参数映射&#xff09;&#x1f332;传递数组&#x1f38d;传递集合&#x1f334;传递JSON数据&#x1f338;JSON概念&#x1f338;JSON的语法&a…

2024年阿里云优惠券(代金券)在哪里领取?

阿里云作为国内领先的云计算服务提供商&#xff0c;不仅提供了稳定、高效的云服务&#xff0c;还时常推出各种优惠活动&#xff0c;以此来吸引用户上云。其中&#xff0c;阿里云优惠券就是一种常见的优惠方式。那么&#xff0c;在2024年&#xff0c;我们该如何领取阿里云优惠券…

动态规划:背包问题合集

01背包 定义dp[i][j]&#xff1a;在前i件物品中选出若干件&#xff0c;放入容量为j的背包&#xff0c;能获得的最大价值。 考虑第i件物品拿还是不拿。讨论c[i]与背包容量的关系&#xff1a; &#xff08;1&#xff09;j < c[i] 时&#xff0c;背包容量为j&#xff0c;而第…

基于java+springboot+vue实现的教学辅助系统(文末源码+Lw)23-225

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

ics-05-攻防世界

题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…

LLM-base版本和chat版本的比较

突然想到了这个问题&#xff0c;网上搜集了一些资料&#xff0c;自己也总结一下 首先放一张llama2论文当中的图&#xff0c;可以很直观的看到区别 面试回答版 问题&#xff1a; 大语言模型base版和chat版的区别是什么&#xff1f; 回答&#xff1a; base版本更适合文本补全…

TechTool Pro for Mac v19.0.3中文激活版 硬件监测和系统维护工具

TechTool Pro for Mac是一款专为Mac用户设计的强大系统维护和故障排除工具。它凭借全面的功能、高效的性能以及友好的操作界面&#xff0c;赢得了广大用户的信赖和好评。 软件下载&#xff1a;TechTool Pro for Mac v19.0.3中文激活版 作为一款专业的磁盘和系统维护工具&#x…