当前位置: 首页 > news >正文

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

在这里插入图片描述

相关文章:

  • 隐私计算实训营学习七:隐语SCQL的架构详细拆解
  • 数据库的基本操作
  • 面试题多态结合线程
  • 【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG,选择xwr68xx还是xwr64xx,及需要注意的问题
  • 【测试面试题】14题常见APP测试面试题(参考答案)
  • 加州大学欧文分校英语基础语法专项课程02:Questions, Present Progressive and Future Tenses 学习笔记
  • Inotify
  • Linux网络编程二(TCP图解三次握手及四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)
  • DNS以及dnsmasq 搭建 dns 局域网(2)
  • 每日五道java面试题之ZooKeeper篇(一)
  • AWS-EKS 给其他IAM赋予集群管理权限
  • set feedback 和set define
  • MySQL 行锁和表锁是什么?区别,作用等学习总结
  • 【算法】求平方根 - 二分法/牛顿迭代
  • 如何高效学习Python编程语言
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 77. Combinations
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • gitlab-ci配置详解(一)
  • Invalidate和postInvalidate的区别
  • IP路由与转发
  • mongo索引构建
  • mysql_config not found
  • Python利用正则抓取网页内容保存到本地
  • SAP云平台里Global Account和Sub Account的关系
  • windows-nginx-https-本地配置
  • 关于springcloud Gateway中的限流
  • 解析带emoji和链接的聊天系统消息
  • 前端自动化解决方案
  • 如何编写一个可升级的智能合约
  • 三栏布局总结
  • 深入浅出Node.js
  • 十年未变!安全,谁之责?(下)
  • 微信小程序填坑清单
  • 详解移动APP与web APP的区别
  • 项目实战-Api的解决方案
  • 智能合约Solidity教程-事件和日志(一)
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (1)Nginx简介和安装教程
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (第一天)包装对象、作用域、创建对象
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)jdk与jre的区别
  • (转)Linux下编译安装log4cxx
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • **PHP分步表单提交思路(分页表单提交)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .htaccess 强制https 单独排除某个目录
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法