STL sort排序算法详细介绍

2023-10-26

用于C++中,对给定区间所有元素进行排序。头文件是#include <algorithm>
时间复杂度为n*log2(n)


Sort函数有三个参数:

  1. 第一个是要排序的数组的起始地址。
  2. 第二个是结束的地址(最后一位要排序的地址的下一地址)
  3. 第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

第一种方法:

Sort函数使用模板:
Sort(start,end,排序方法)

#include<iostream>  
#include<algorithm>  
using namespace std;  
int main()  
{  
    int a[10]={9,6,3,8,5,2,7,4,1,0};  
    for(int i=0;i<10;i++)  
    cout<<a[i]<<endl;  

    sort(a,a+10);//第三个参数不用写(如果是从小到大排序的话)  

    for(int i=0;i<10;i++)  
        cout<<a[i]<<endl;  
    return 0;  
}  

当从大到小排序是需要借助第三个参数进行判别

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

bool compare(int a,int b)  
{  
    return a>b;  
}  
int main()  
{  
    int a[10]={9,6,3,8,5,2,7,4,1,0};  
    for(int i=0;i<10;i++)  
        cout<<a[i]<<endl;  
    //从大到小排序    
    sort(a,a+10,compare);//在这里就不需要对compare函数传入参数了, 

    //这是规则  
    for(int i=0;i<10;i++)  
        cout<<a[i]<<endl;  
    return 0;  
}  


第二种方法:

  • 上述方法实现了从小到大排序,从大到小排序,但是有点麻烦,可以利用现有的头文件进行实现(类型支持“<”,”>”等比较符)。
  • functional提供了一种基于模板的比较函数对象,equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>
  • 常用的有greater <Type>()从大到小排序,less <Type>()从小到大排序。

第三种方法:

编写运算符重载函数

<返回类型说明符> operator <运算符符号>(<参数表>)
{

     <函数体>

}

对于这种方法,一般应用于自定义数据类型,因为sort排序函数是应用
<实现功能的。
程序举例:

struct Test
{
  int mem1;
  int mem2;
  bool operator< (const Test t)  
  {  
      return this->mem1<t.mem1;  
  }  
};

当然也可以用第一种方法,自定义比较函数实现!!!

第四种方法:

定义外部比较类:

struct Less
{ 
   bool operator()(const Student& s1, const Student& s2)
       {  
             return s1.name < s2.name; //从小到大排序    
       }
 };
std::sort(sutVector.begin(), stuVector.end(), Less());

sort函数使用

STL提供了两种调用方式,一种是使用默认的<操作符比较,一种可以自定义比较函数。
实现原理:
STL中的sort并非只是普通的快速排序,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。当数据量较大时采用快速排序,分段递归。一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。
普通的快速排序可以叙述如下,假设S代表需要被排序的数据序列:


  1. 如果S中的元素只有0或1,结束
  2. 取S中的任何一个元素作为枢轴pivot
  3. 将S分割为L、R两端,使L中的元素都小于等于pivot,R中的元素都大于等于pivot。
  4. 对L、R递归执行上述过程。

快速排序最关键的地方在于枢轴的选择,最坏的情况发生在分割时产生了一个空的区间,这样就完全没有达到分割的效果。STL采用的做法称为median-of-three,即取整个序列的首、尾、中央三个地方的元素,以其中值作为枢轴。

分割的方法通常采用两个迭代器head和tail,head从头端往尾端移动,tail从尾端往头端移动,当head遇到大于等于pivot的元素就停下来,tail遇到小于等于pivot的元素也停下来,若head迭代器仍然小于tail迭代器,即两者没有交叉,则互换元素,然后继续进行相同的动作,向中间逼近,直到两个迭代器交叉,结束一次分割。

看一张来自维基百科上关于快速排序的动态图片,帮助理解。
这里写图片描述
快速排序的口诀:
东拆西补,西拆东补,一边拆一边补,递归完成所有过程
这里写图片描述
对元素5的两边的元素也重复以上操作,直到元素达到有序状态


  • 内省式排序Introsort
    不当的枢轴选择,导致不当的分割,会使快速排序恶化到O(n^2)。David R.Musser于1996年提出一种混合式排序算法:Introspective Sorting(内省式排序),简称IntroSort,其行为大部分与上面所说的median-of-three Quick Sort完全相同,但是当分割行为有恶化为二次方的倾向时,能够自我侦测,转而改用堆排序,使效率维持在堆排序的 O(nlgn),又比一开始就使用堆排序来得好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL sort排序算法详细介绍 的相关文章

  • [C++](26)智能指针

    文章目录 引入 智能指针的原理 C 智能指针及其问题 auto ptr unique ptr shared ptr weak ptr 删除器 引入 首先看下面这个程序 int div int a b cin gt gt a gt gt b
  • 智能指针与句柄详解(一)

    前言 智能指针与引用计数详解 一 中提到实现智能指针有两种方法 一种是引用计数 另一种就是句柄类实现 什么是句柄类 句柄类是用来存储和管理基类指针 指针所指对象的类型可以变化 它既可以指向基类类型对象又可以指向派生类型对象 用户通过句柄类访
  • 关于C++中constexpr的用法

    在C 11 primer中 关于constexpr用法给出的解释是 允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式 声明为constexpr的变量一定是一个常量 而且必须用常量表达式初始化 第一句中 c
  • C++ bind与回调函数

    1 回调函数 注册回调函数里可以使用functional来统一接口 可以传入函数指针 lambda bind等 函数1 2 为一个模块 为回调函数 函数3为一个模块 为注册回调函数 形参为函数指针 注册回调函数的入参为函数指针 指向回调函数
  • C++ string类的实现

    个人简介 作者简介 大家好 我是菀枯 支持我 点赞 收藏 留言 格言 不要在低谷沉沦自己 不要在高峰上放弃努力 前言 在C语言中 没有专门用来表示字符串的类型 C语言的字符串是一系列以 0 为结尾的字符的集合 虽然C语言为这样的字符串提供了
  • ##顺序表 编码##

    ifndef LIST H define LIST H class List public List int size List 析构函数 void ClearList 清空线性表 bool ListEmpty 判断线性表是否为空 int
  • ASCII Unicode, UTF8 的关系,string和wstring转换

    目录 1 三大编码由来和转换 2 三大编码在计算机中应用 3 char string 和wchar t wstring 转换 写这篇文章遇到的的问题是c 操作正则的时候 遇到中文出现匹配失败 以及visual studio中中文乱码问题 当
  • c++下的文件批量读写——查找文件的类 struct _finddata_t结构体用法

    查找文件的类 struct finddata t结构体用法 https blog csdn net yang332233 article details 53081785 但是运行原链接的代码时在while findnext handle
  • 关于C++对象模型(下)

    下篇主要讨论调用成员函数 访问成员变量的开销 及其特殊成员函数 数组 异常处理的讨论 这篇文章中出现的对象定义都出现在上篇中 全文在这里下载 文章内容转自 http tb blog csdn net TrackBack aspx PostI
  • STL——vector以及emplace_back分析

    1 这里需要注意凡是连续空间的容器都提供operator 是为了数组操作 2 back 应该是 end 1 3 vector的大小为12 vector的迭代器为指针 1 emplace back 1 相比push back 如果传入临时对象
  • vector string及数组使用

    使用vector输入字符串并输出字符串 include
  • C++学习(四六九)LRU Least Recently Used算法

    LRU是Least Recently Used的缩写 即最近最少使用 最近一段时间最少使用 是一种常用的页面置换算法 选择最近最久未使用的页面予以淘汰 该算法赋予每个页面一个访问字段 用来记录一个页面自上次被访问以来所经历的时间 t 当须淘
  • Cpp关键字破解(三)【volatile】篇

    关键字总结 volatile 文章目录 关键字总结 volatile 0 前言 1 概念 2 作用 3 使用场景 4 volatile成员函数 5 代码体验 0 前言 参考几位前辈博客 汇总整理了一下 C 中volatile关键字的使用详解
  • C语言中关键字const、static、volatile的用法分析

    1 const 作为一个程序员 我们看到关键字const时 首先想到的应该是 只读 因为 它要求其所修饰的对象为常量 不可对其修改和二次赋值操作 不能作为左值出现 看几个例子 const int a 同上面的代码行是等价的 都表示一个常整形
  • c++编写COM组件,并使用该组件

    在网上看了很多个介绍com组件的方法 对于一个新手来说看很久都看不懂 自己项目需要实现com 于是自己整理了一个文档和代码 先记录下来 以防以后用的上 步骤如下 1 新建ATL项目 你也可以是其他项目 只要是dll就行 可以支持MFC AT
  • STL之set常见用法详解

    摘自胡凡的 算法笔记 仅作记录用 前言 set是一个内部自动有序且不含重复元素的容器 如果要使用set 需要添加set头文件 即 include
  • Ubuntu20.04中VSCode配置C++以及分文件编写配置

    网上搜索了很多文章 一直显示找不到自定义的头文件 今天总算捣鼓出来了 参考文章 https www cnblogs com icmzn p 16244665 html https blog csdn net qq 39048131 arti
  • 对于单向链表的排序与去重

    include bits stdc h using namespace std struct node int num node next class Chain public Chain head tail new node void G
  • c++使用继承类实现异常处理

    sales h pragma once include
  • acwing算法提高之动态规划--最长上升子序列模型(上)

    目录 1 基础知识 2 模板 3 工程化 1 基础知识 暂无 2 模板 暂无 3 工程化 题目1 怪盗基德的滑翔翼 有N个数 表示房屋的高度 你可以任意选择一个房屋作为起点 选择朝左飞 或者朝右飞 必须严格递减才能够飞到下一个房屋 求经过的

随机推荐

  • springboot Junit单元测试默认事务不提交

    目录 一 Junit初次使用 二 Junit事务问题 1 默认不提交事务 默认回滚 2 设置rollback 让Junit提交事务 一 Junit初次使用 因为以前总觉得Junit单元测试配置比较繁琐 代码功能大多使用main方法或者pos
  • SD秋叶安装教程

    前言 本部署整合包基于开源项目 stable diffusion webui制作 部署包作者 秋葉aaaki 免责声明 本安装包及启动器免费提供 无任何盈利目的 电脑配置要求 操作系统 windows10以后 CPU 不做强制要求 内存 推
  • 输出斐波那契数列的每一项,每五个换行

    7 2 利用数组计算斐波那契数列 15 分 本题要求编写程序 利用数组计算菲波那契 Fibonacci 数列的前N项 每行输出5个 题目保证计算结果在长整型范围内 Fibonacci数列就是满足任一项数字是前两项的和 最开始两项均定义为1
  • FFmpeg录制流

    FFmpeg下windows安装 下载地址 http ffmpeg org download html windows 下载 ffmpeg release essentials zip 这个文件名 解压后将bin目录加到环境变量path 录
  • 内存使用(分段、分区、分页、多级页表、快表)--OS

    内存使用 内存使用 将程序放在内存中 PC指向内存地址 首先 我们需要让程序进入内存 举个例子 int main int argc char argv text entry 入口地址 call main call exit main ret
  • windows默认文件(桌面、下载、文档等)设置为C盘根路径后怎么修改回去

    桌面 下载 文档等设置为C盘根路径后怎么修改回去 1 问题 2 解决办法 2 1 按 Win R 调出运行窗口 输入 regedit 并按回车 2 2 在弹出的注册表窗口里 打开下面路径 计算机 HKEY CURRENT USER SOFT
  • 数据结构——迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉算法又叫狄克斯特拉算法 是从一个顶点到其余各顶点的最短路径算法 解决的是有权图中最短路径问题 迪杰斯特拉算法主要特点是从起始点开始 采用贪心算法的策略 每次遍历到始点距离最近且未访问过的顶点的邻接节点 直到扩展到终点为止 以下是数
  • 【Golang】切片(slice)

    文章目录 切片 直接声明新的切片 append 函数为切片添加元素 复制切到另一个切片 从切片中删除元素 从开头位置删除 从中间位置删除 从尾部删除 切片 切片 slice 是对数组的一个连续片段的引用 所以切片是一个引用类型 这个片段可以
  • scss 转为 less

    tnpm install less plugin sass2less g sass2less scss dir name less rm rf scss 转载于 https www cnblogs com lyraLee p 1048966
  • virtualbox的虚拟机联不通外网的问题

    问题描述 在网卡配置上按照网上的操作配置好了 但是仍然联不通外网 ip地址显示为127 0 0 1 解决 通过输入dhclient v命令解决
  • Spring框架常用注解及通配符总结

    Autowired 自动注入 默认是类型匹配 使用配置文件需要set 使用注解不需要 只需要类属性 Autowired可以和 Qualifier beanName 配合着使用 Qualifier beanName 多个相同类型的bean 标
  • 基于深度学习的目标检测方法综述

    引言 现有的深度学习的目标检测方法 可以大致分为两类 一 基于候选区域的目标检测方法 二 基于回归的目标检测方法 依据方法的提出时间 可以构建出如下时间线 2014 CVPR R CNN 1 2015 arXiv DenseBox 14 2
  • 「开源项目」现代化开源Linux服务器运维管理面板-1Panel

    1Panel 基本介绍 1Panel 是新一代的 Linux 服务器运维管理面板 产品优势 快速建站 深度集成 Wordpress 和 Halo 域名绑定 SSL 证书配置等一键搞定 高效管理 通过 Web 端轻松管理 Linux 服务器
  • arm汇编中感叹号/叹号的作用

    arm汇编中存在一个神奇的可选后缀 一般是在寄存器或寻址方式之后 对于加了叹号的情况 访问内存时先根据寻址方式更改寄存器的值 再按照该已经更新的值访问内存
  • 基于深度学习的目标检测算法概述

    摘要 目标检测是计算机视觉的一个重要分支 其目的是准确判断图像或视频中的物体类别并定位 传统的目标检测方法包括这三个步骤 区域选择 提取特征和分类回归 这样的检测方法存在很多问题 现已难以满足检测对性能和速度的要求 基于深度学习的目标检测方
  • 电子元器件/模块供应商汇总

    晶振 WIFI MLCC电容
  • Python制作模拟按键摘录,pyautogui库及该库在某些窗口不生效的问题部分解决措施(PyDirectInput库、winio驱动级模拟)

    文章目录 toc 一 使用pyautogui库 1 安装pyautogui库 2 导入并在py中使用 1 导包 2 基本鼠标控制 3 基本键盘控制 4 屏幕截图 5 图片位置识别 3 存在问题 二 使用PyDirectInput库解决某些游
  • 机器学习——数据清洗,特征选择

    数据清洗的方法 设置阈值去掉异常值 随机森林预测去掉点的数值加进去 onehot编码 不适用于决策树和随机森林 先将一个属性分成几个类别 然后再将样本的数据变成矩阵01 1表示其所在类别 会导致特征数增多 数据清洗代码实现 import n
  • Linux磁盘扩容详解

    公司项目服务器是买的阿里的 原来的项目是外包出去别人做的 用户图片上传保存到了服务器上 500G的磁盘空间硬生生给用完了 怎么搞 扩容呗 大概思路就是从阿里那再买一块磁盘 添加到ESC实例上 然后挂载 然后格式化磁盘文件 然后把老图片mv过
  • STL sort排序算法详细介绍

    用于C 中 对给定区间所有元素进行排序 头文件是 include