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

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函数可以方便地对容器中的元素进行逆序操作,非常实用。

在这里插入图片描述

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

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

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

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

相关文章

作业1-224——P1015 [NOIP1999 普及组] 回文数

题目描述 思路 首先此题为一道高精度题&#xff0c;然后本题按照题目意思模拟即可。我们可以开两个数组来记录高精度数字&#xff0c;这样方便我们处理。判断“该数组是否回文”、“c翻转存入d再做cd”可以写成两个单独的函数。然后主程序组织一下他们即可。注意好退出循环的…

CSC联合培养博士生需要特别关注的几点问题

国家留学基金委&#xff08;CSC&#xff09;的联合培养博士生的申请方法、申报流程等&#xff0c;我们以往做过多次介绍&#xff0c;但因为在读博士本身的特殊性&#xff0c;申请时还应考虑其它因素&#xff0c;本篇知识人网小编谈谈联培博士生需要特别关注的问题。 一、注意安…

VIT速记

VIT架构 【ViT论文逐段精读【论文精读】】 【精准空降到 30:29】 https://www.bilibili.com/video/BV15P4y137jb/?share_sourcecopy_web&vd_sourcef09504571c3138e9e610217797aba3a4&t1829 首先把图片分为几个Patch&#xff0c;比如我们此时输入的图片为224*224*3&…

渗透测试靶场环境搭建

1.DVWA靶场 DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用&#xff0c;包含了OWASP TOP10的所有攻击漏洞的练习环境&#xff0c;旨在为安全专业人员测试自己的专业技能和工具提供合法的环境&#xff0c;同时…

判断闰年(1000-2000)

判断规则&#xff1a;1.能被4整除&#xff0c;不能被100整除是闰年,2.能被400整除是闰年 #include <stdio.h>int is_leap_year(int n){if((n % 400 0)||((n % 4 0)&&(n % 100 ! 0)))return 1;elsereturn 0; } int main() {int i 0;int count 0;for(i 1000;…

【C++精简版回顾】15.继承派生

1.继承派生的区别 继承&#xff1a;子继父业&#xff0c;就是子类完全继承父类的全部内容 派生&#xff1a;子类在父类的基础上发展 2.继承方式 1.public继承为原样继承 2.protected继承会把public继承改为protect继承 3.private继承会把public&#xff0c;protected继承改为pr…

179基于matlab的2D-VMD处理图像

基于matlab的2D-VMD处理图像&#xff0c;将图片进行VMD分解&#xff0c;得到K个子模态图&#xff0c;将每个模态图进行重构&#xff0c;得到近似的原图。可以利用这点进行图像去噪。程序已调通&#xff0c;可直接运行。 179 2D-VMD 图像分解重构 图像处理 (xiaohongshu.com)

什么是VR古迹探索|VR设备购买|VR文化旅游

VR古迹探索是利用虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术来探索和体验历史古迹的方法。通过VR技术&#xff0c;人们可以在虚拟环境中逼真地模拟历史遗迹、古迹或文化遗产的场景&#xff0c;以全新的视角进行互动和探索。 通过VR古迹探索&#…

“智慧代码阁”千聊知识店铺成立了

前两天我在千聊上注册了知识店铺“智慧代码阁” 欢迎大家来购买更加精品的代码 点击这里进入知识店铺 非常感谢大家&#xff01;&#xff01;&#xff01; 欢迎来到“智慧代码阁”——您的专属知识宝库&#xff0c;专注于为代码爱好者和专业人士提供前沿、实用、系统的编程知…

、JMETER与它的组件们

os进程取样器 这个取样器可以让jmeter直接调用python写的测试数据 这样就可以调用python写的测试数据给到jmeter进行调用 注意&#xff1a;1建议python返回转json格式dumps一下&#xff1b;2py文件中需要把结果打印出来&#xff0c;可以不用函数直接编写 传到jmeter之后可以用…

手机备忘录导到电脑上有什么方法简单点

在这个信息爆炸的时代&#xff0c;我们每天都在处理海量的信息和待办事项。手机备忘录里记录着重要的灵感、会议安排、待购物品清单……但每次想在电脑上继续编辑或查看时&#xff0c;我都感到无比头疼。难道就没有一种简单的方法&#xff0c;能让手机备忘录和电脑轻松同步吗&a…

41、网络编程/TCP.UDP通信模型练习20240301

一、编写基于TCP的客户端实现以下功能&#xff1a; 通过键盘按键控制机械臂&#xff1a;w(红色臂角度增大)s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09;按键控制机械臂 1.基于TCP服务器的机械臂…

fly-barrage 前端弹幕库(3):滚动弹幕的设计与实现

项目官网地址&#xff1a;https://fly-barrage.netlify.app/&#xff1b; &#x1f451;&#x1f40b;&#x1f389;如果感觉项目还不错的话&#xff0c;还请点下 star &#x1f31f;&#x1f31f;&#x1f31f;。 Gitee&#xff1a;https://gitee.com/fei_fei27/fly-barrage&a…

力扣-多数元素

问题 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 解答 class Solution {public int majorityElement(int[] nums) {Arrays…

Mathtype安装时word启动显示“文件未找到:MathPage.WLL”

背景 由于老板布置的临时工作&#xff0c;需要安装Mathtype&#xff0c;但尝试了3个不同的版本后&#xff08;每次都卸载干净了&#xff09;&#xff0c;均未能成功安装&#xff0c;出现的报错3个版本各不相同&#xff1a; ①解压安装过程中失败&#xff08;这个版本不再尝试…

SpringBoot 自定义映射规则resultMap association一对一

介绍 例&#xff1a;学生表&#xff0c;班级表&#xff0c;希望在查询学生的时候一起返回该学生的班级&#xff0c;而一个实体类封装的是一个表&#xff0c;如需要多表查询就需要自定义映射。 表结构 班级表 学生表 SQL语句 SELECT a.id,a.name,a.classes,b.id classes…

数电学习笔记——逻辑函数及其描述方法

目录 一、逻辑函数 二、逻辑函数的描述方法 1、逻辑真值表 2、逻辑函数式 3、逻辑图 4、波形图 三、逻辑函数的两种标准形式 1、最小项与最大项 最小项 最小项的性质 最大项 最大项的性质 2、最大项与最小项的关系 3、逻辑函数的最小项之和形式 4、逻辑函数的最…

羊大师分享,羊奶奶有哪些对健康有益的喝法?

羊大师分享&#xff0c;羊奶奶有哪些对健康有益的喝法&#xff1f; 羊奶奶有多种对健康有益的喝法&#xff0c;以下是一些建议&#xff1a; 直接饮用&#xff1a;将羊奶直接煮沸后饮用&#xff0c;可以保留羊奶中的营养成分&#xff0c;为身体提供全面的滋养。羊奶的丰富蛋白质…

Stable Diffusion 模型分享:Realistic Stock Photo(真实的库存照片)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 条目内容类型大模型基础模型SDXL 1.0来源CIVITAI作者PromptSharingSamaritan文件名称reali…

b站小土堆pytorch学习记录——P7-P8 Tensorboard的使用

文章目录 一、前置知识1.Tensorboard是什么2.SummaryWriter3.add_scalar()4.add_image() 二、代码1.一次函数2.蚂蚁和蜜蜂图片 一、前置知识 1.Tensorboard是什么 TensorBoard 是 TensorFlow 的可视化工具&#xff0c;它允许开发者可视化模型的图&#xff08;graph&#xff0…