C++ 补充之常用排序算法

news2024/9/21 10:17:22

C++ 补充之常用排序算法在这里插入图片描述

常用的排序算法主要包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序,下面简单介绍一下它们的概念和原理:

  1. 冒泡排序(Bubble Sort):
    冒泡排序是一种基础的排序算法,它重复地走访要排序的元素列,依次比较相邻两个元素的大小,如果顺序不对则交换它们。通过多次遍历,每次最大的元素会慢慢“冒泡”到正确的位置。

  2. 选择排序(Selection Sort):
    选择排序是一种简单直观的排序算法,基本思路是每次在未排序的数据中选择最小(或最大)的元素,放到已排序部分的末尾。重复这个过程,直到所有元素都排序完毕。

  3. 插入排序(Insertion Sort):
    插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序类似于扑克牌整理手中的牌的过程。

  4. 快速排序(Quick Sort):
    快速排序是一种高效的排序算法,采用分治策略将数组分成两部分,然后递归地对子数组进行排序。具体做法是选择一个基准值,将小于基准值的元素放到左边,大于基准值的元素放到右边,最终实现整个数组的排序。

  5. 归并排序(Merge Sort):
    归并排序也是一种分治算法,将数组一分为二,分别对左右两部分进行排序,然后合并两个有序数组以获得最终有序结果。归并排序的关键在于合并操作。

  6. 堆排序(Heap Sort):
    堆排序利用堆这种数据结构来实现排序,堆是一个完全二叉树,可以分为最大堆和最小堆。堆排序首先将数组构建成一个最大堆或最小堆,然后不断取出堆顶元素(最大或最小值),再调整剩余元素使之重新满足堆的性质,最终得到有序序列。

每种排序算法都有其适用的场景和优缺点,根据具体情况选择合适的算法能够提高排序的效率。

C++ 补充之常用排序算法sort

C++标准库中的sort函数使用的是快速排序(Quick Sort)和插入排序(Insertion Sort)的混合算法,称为Introsort。具体原理如下:

  1. 首先,sort函数会检测到排序的元素数量是否超过了阈值(通常是16个元素)。如果超过了阈值,将使用快速排序算法。

  2. 快速排序通过选取一个基准元素(pivot),将待排序序列分为两部分:小于等于基准元素的部分和大于基准元素的部分。然后,分别对这两部分进行递归地快速排序。这样,最终整个序列就会有序。

  3. 如果排序的元素数量较少(小于等于阈值),sort函数将转而使用插入排序算法。

  4. 插入排序算法从第二个元素开始,将每一个元素插入到已排序好的部分中的正确位置,直到所有元素都被插入。这种算法能够在元素数量较少时表现出良好的性能。

下面以一个例子来说明sort函数的使用:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {5, 2, 8, 4, 1, 9};

    // 使用sort函数对nums进行排序
    std::sort(nums.begin(), nums.end());

    // 输出排序后的结果
    for (int num : nums) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

该例子中,我们使用std::sort函数对nums进行排序。std::sort函数会根据元素的类型调用相应的比较函数,默认使用升序排序。

输出结果为:1 2 4 5 8 9,即排序后的数组。注意,sort函数修改了原始数组,使其有序。

sort函数的时间复杂度平均情况下为O(n log n),最坏情况下为O(n^2)。但由于sort函数使用了Introsort算法,通常情况下能够获得较好的性能。

C++ 补充之常用排序算法random_shuffle

在这里插入图片描述

在C++中,std::random_shuffle函数主要用于将指定范围内的元素进行随机重排。在C++17标准及之后,std::random_shuffle已经被弃用,建议使用std::shuffle代替。下面简要介绍一下std::shuffle的原理和一个示例:

std::shuffle的原理:

std::shuffle函数通过引入随机数生成器来对指定范围内的元素进行重新排列。具体原理如下:

  1. 随机数生成器会生成一个序列的伪随机数,代表元素的新位置。
  2. 按照生成的随机数对容器中的元素进行重新排列,从而达到随机打乱的效果。

示例代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};

    // 使用std::random_device和std::default_random_engine生成随机数种子
    std::random_device rd;
    std::default_random_engine rng(rd());

    // 使用std::shuffle函数对nums进行随机重排
    std::shuffle(nums.begin(), nums.end(), rng);

    // 输出重排后的结果
    for (int num : nums) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们首先使用std::random_devicestd::default_random_engine生成一个随机数生成器,并将其作为参数传递给std::shuffle函数。std::shuffle函数会利用这个随机数生成器对nums进行随机重排。

运行示例代码后,每次输出都会得到不同的排列顺序,因为std::shuffle函数会根据生成的随机数对元素进行重新排列。

为了避免伪随机数生成器生成相同序列的问题,通常使用std::random_device作为种子,以确保每次运行时生成不同的随机序列。

C++ 补充之常用排序算法merge

在C++中,std::merge函数用于合并两个已排序的序列(通常是有序的容器),返回一个合并后的有序序列。下面我们来详细介绍一下std::merge的原理和给出一个示例代码:
在这里插入图片描述

std::merge的原理:

std::merge函数通过将两个已排序的序列合并成一个新的有序序列,基本原理如下:

  1. 创建一个新的目标序列,长度为两个输入序列长度之和。
  2. 从两个输入序列的起始位置开始进行比较,每次选择较小(或较大)的元素插入到目标序列中。
  3. 继续比较两个序列中未处理元素,并将较小(或较大)的元素插入到目标序列中。
  4. 最终得到一个有序的合并序列,其中包含了两个输入序列的所有元素。

示例代码:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec1 = {1, 3, 5, 7};
    std::vector<int> vec2 = {2, 4, 6, 8};

    // 目标序列,用于存放合并后的有序序列
    std::vector<int> merged(vec1.size() + vec2.size());

    // 使用std::merge函数对vec1和vec2进行合并,结果存放在merged中
    std::merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), merged.begin());

    // 输出合并后的有序序列
    for (int num : merged) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上述示例中,首先定义了两个已排序的向量vec1vec2,然后定义了一个目标向量merged来存放合并后的有序序列。接着使用std::merge函数对vec1vec2进行合并,将结果存放在merged中。

运行示例代码后,输出结果为:1 2 3 4 5 6 7 8,即两个输入序列合并后的有序序列。std::merge函数在合并两个序列时会保持其有序性,因此可以方便地将两个有序序列合并为一个新的有序序列。

C++ 补充之常用排序算法reverse

在C++中,std::reverse函数用于对指定范围内的元素进行逆序操作。下面我们来详细介绍一下std::reverse的原理和给出一个示例代码:

std::reverse的原理:

std::reverse函数会将指定范围内的元素反转,即将第一个元素与最后一个元素互换,依次类推,直到整个范围内的元素完成反转操作。

示例代码:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};

    // 使用std::reverse函数对nums进行逆序操作
    std::reverse(nums.begin(), nums.end());

    // 输出逆序后的结果
    for (int num : nums) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上述示例中,我们首先定义了一个包含数字1到5的向量nums,然后使用std::reverse函数对nums进行逆序操作,即将向量中的元素反转。最后,通过遍历输出逆序后的结果。

输出结果为:5 4 3 2 1,即原始序列{1, 2, 3, 4, 5}经过逆序操作后变为{5, 4, 3, 2, 1}。std::reverse函数可以方便地对容器中的元素进行逆序操作,非常实用。

在这里插入图片描述

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

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

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

相关文章

【激光SLAM】基于已知位姿的构图算法 (Grid-based)

文章目录 地图分类概念 覆盖栅格建图算法栅格地图的特征数学描述假设 算法流程激光雷达的逆观测模型 计数(Count Model)建图算法概念数学描述观测模型地图估计 地图分类 概念 地图即为环境的空间模型。环境地图是机器人进行定位和规划的前提。定位可以用特征地图&#xff08;…

LNMP架构介绍及配置--部署Discuz社区论坛与wordpress博客

一、LNMP架构定义 1、LNMP定义 LNMP&#xff08;Linux Nginx Mysql Php&#xff09;是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写&#xff1b;Linux系统下NginxMySQLPHP这种网站服务器架构。 Linux是一类Unix计算机操作系统的统称&#xff0c;是目…

探秘Python的Pipeline魔法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 什么是Pipeline&#xff1f; Pipeline的基本用法 Pipeline的高级用法 1. 动态调参 2. 并行处理 3. 多输出 …

libvirt命名空间xmlns:qemu的使用

示例xml <domain type{domain_type} xmlns:qemuhttp://libvirt.org/schemas/domain/qemu/1.0><qemu:commandline><qemu:commandline><qemu:arg value-newarg/><qemu:env nameQEMU_ENV valueVAL/></qemu:commandline></domain>"…

移动机器人规划控制入门与实践:基于Navigation2

近年来&#xff0c;自主移动机器人与自动驾驶持续火热。自主移动机器人在越来越多的行业得以落地&#xff0c;在提升效率&#xff0c;节省人力成本&#xff0c;提高作业安全性等方面做出巨大贡献。自动驾驶也在迅速发展&#xff0c;越来越多的汽车标配自动泊车功能&#xff0c;…

简历中自我评价,是否应该删掉?

你好&#xff0c;我是田哥 年后&#xff0c;不少朋友已经开始着手准备面试了&#xff0c;准备面试的第一个问题就是&#xff1a;简历。 写简历是需要一些技巧的&#xff0c;你的简历是要给面试官看&#xff0c;得多留点心。 很多简历上都会写自我评价/个人优势/个人总结等&…

gcd+线性dp,[蓝桥杯 2018 国 B] 矩阵求和

一、题目 1、题目描述 经过重重笔试面试的考验&#xff0c;小明成功进入 Macrohard 公司工作。 今天小明的任务是填满这么一张表&#xff1a; 表有 &#xfffd;n 行 &#xfffd;n 列&#xff0c;行和列的编号都从 11 算起。 其中第 &#xfffd;i 行第 &#xfffd;j 个元素…

网络安全课程VIP介绍(比同行便宜)

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0c…

【C++精简版回顾】14.(重载2)流重载

1.流重载 istream ostream 1.class class MM {friend ostream& operator<<(ostream& out, MM& mm);friend istream& operator>>(istream& in, MM& mm); public:MM() {}MM(int age,string name):age(age),name(name) {} private:int age;st…

今年2024年腾讯云有优惠吗?有啊,特价进行时ing

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

LaMa Image Inpainting 图像修复 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址&#xff1a;https://github.com/advimman/lama &#x1f999; LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

【InternLM 实战营笔记】浦语·灵笔的图文理解及创作部署、 Lagent 工具调用 Demo

浦语灵笔的图文理解及创作部署 浦语灵笔是基于书生浦语大语言模型研发的视觉-语言大模型&#xff0c;提供出色的图文理解和创作能力&#xff0c;结合了视觉和语言的先进技术&#xff0c;能够实现图像到文本、文本到图像的双向转换。使用浦语灵笔大模型可以轻松的创作一篇图文推…

CrossOver 24下载-CrossOver 24 for Mac下载 v24.0.0中文永久版

CrossOver 24是一款可以让mac用户能够自由运行和游戏windows游戏软件的虚拟机类应用&#xff0c;虽然能够虚拟windows但是却并不是一款虚拟机&#xff0c;也不需要重启系统或者启动虚拟机&#xff0c;类似于一种能够让mac系统直接运行windows软件的插件。它以其出色的跨平台兼容…

(二十二)devops持续集成开发——jenkins服务代理Agent搭建

前言 在Jenkins 中&#xff0c;代理&#xff08;Agent&#xff09;是一种用于执行构建、部署和其他任务的计算节点。代理节点可以是物理机器、虚拟机或容器&#xff0c;它们负责接收 Jenkins 主控节点委派的任务并执行这些任务。通过使用代理节点&#xff0c;可以有效地分担Je…

java基础(4)注解,集合,

注解 什么是注解&#xff08;Annotation&#xff09;&#xff1f;注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释” // this is a component: Resource("hello") public class Hello {Injectint n;PostConstructpublic void hello(Param String name…

【嵌入式——QT】数值输入和显示组件

数值输入和显示组件 QSlider&#xff1a;滑动条&#xff0c;通过滑动来设置数值&#xff1b;QScrollBar&#xff1a;卷滚条&#xff0c;与QSlider类似&#xff0c;还可以用于卷滚区域&#xff1b;QProgressBar&#xff1a;进度条&#xff0c;一般用于显示任务进度&#xff0c;…

2024年3月2日 十二生肖 今日运势

小运播报&#xff1a;2024年3月2日&#xff0c;星期六&#xff0c;农历正月廿二 &#xff08;甲辰年丙寅月乙丑日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;鸡、蛇、鼠 需要注意&#xff1a;狗、马、羊 喜神方位&#xff1a;西北方 财神方位&#xff1a;东…

AI大模型提供商有哪些?

AI大模型提供商&#xff1a;引领人工智能创新浪潮 随着人工智能技术的迅猛发展&#xff0c;AI大模型成为了推动行业变革和创新的核心驱动力之一。作为AI领域的重要参与者&#xff0c;AI大模型提供商扮演着关键的角色。本文将围绕这一主题&#xff0c;介绍几家在AI大模型领域具…

SpringBoot3-数据访问

整合SSM场景 SpringBoot 整合 Spring、SpringMVC、MyBatis 进行数据访问场景开发 1. 创建SSM整合项目 <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> <dependency><groupId>org.mybatis.spring.boot&…

论文阅读:2020GhostNet华为轻量化网络

创新&#xff1a;&#xff08;1&#xff09;对卷积进行改进&#xff08;2&#xff09;加残差连接 1、Ghost Module 1、利用1x1卷积获得输入特征的必要特征浓缩。利用1x1卷积对我们输入进来的特征图进行跨通道的特征提取&#xff0c;进行通道的压缩&#xff0c;获得一个特征浓…