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

在这里插入图片描述

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

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

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

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

相关文章

幸运星数(爷再也不想用pow了)

解法&#xff1a; 暴力 #include <iostream> #include <vector> using namespace std; #define endl \nint main() {ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int n;long long sum 0, a;cin >> n;for (int i 1; i < n; i) {a 1;for (in…

【C++】结构体内存对齐详解

规则 1.第一个成员在结构体变量偏移量为0 的地址处&#xff0c;也就是第一个成员必须从头开始。 2.其他成员的偏移量为对齐数**(该成员的大小 与 编译器默认的一个对齐数 中的较小值)**的整数倍。 3.结构体总大小对最大对齐数&#xff08;通过最大成员来确定&#xff09;的整数…

包管理工具之npm也慌了?

起因 因为npm的种种问题,我很早就换成了pnpm和yarn(但是其实npm也在使用),已经很久没有关注npm的功能更新了。最近无意间进入Node18版本的安装目录,发现其除了常规的node,npm等默认安装了一个新的包corepack,这个就是今天我要分享的东西了。 注: 我因为18版本的node上…

Spring Cloud 实战系列之 Zuul 微服务网关搭建及配置

一、创建SpringBoot项目 用mavan搭建也可以。&#xff08;重要的是后面pom里应该引入那些依赖&#xff0c;application.yml怎么配置&#xff09; 由于开始构建项目时选择了Eureka Server&#xff0c;所以pom.xml中不需要手动添加依赖了 首先在启动类SpringcloudApplicatio…

【爬虫逆向实战 逆向滑块 Python+Node】今天逆向的网站有点嘿嘿,还是仅供学习,别瞎搞

逆向日期&#xff1a;2024.03.01 使用工具&#xff1a;Node.js、Python 加密方法&#xff1a;AES标准算法 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算…

让人春分日 梦熊联盟2023比赛成绩,山西太恐怖

本人是山东人&#xff0c;山东66人 但 没想到山西有77个人&#xff01;&#xff01;&#xff01; 泰酷辣 听懂掌声&#xff01;

靠谱的车【华为OD机试-JAVAPythonC++JS】

题目描述 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xff0c;总是偏大。 出租车司机解释说他不喜欢数字4&#xff0c;所以改装了计费表&#xff0c;任何数字位置遇到数字4就直接跳过&#xff0c;其余功能都正常。 比如&…

Python中操作MySQL和SQL Server数据库的基础与实战【第97篇—MySQL数据库】

Python中操作MySQL和SQL Server数据库的基础与实战 在Python中&#xff0c;我们经常需要与各种数据库进行交互&#xff0c;其中MySQL和SQL Server是两个常见的选择。本文将介绍如何使用pymysql和pymssql库进行基本的数据库操作&#xff0c;并通过实际代码示例来展示这些操作。…

基于Beego 1.12.3的简单website实现

参考 用Beego开发web应用 https://www.cnblogs.com/zhangweizhong/p/10919672.htmlBeego官网 Homepage - beego: simple & powerful Go app frameworkbuild-web-application-with-golang https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/pr…

今天面试招了个18K的人,从腾讯出来的果然都有两把刷子···

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;前面一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在15-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试中&#xff0c;不…

高级语言期末2010级B卷(软件学院)

1.编写程序根据如下公式计算X的值&#xff08;精确到1e-5&#xff09;。 #include <stdio.h>int main(){int i1;double flag1.0/(2*i-1)*2.0*i/(2*i-1);double sum0;while(flag>1e-5){sumflag;i;flag1.0/(2*i-1)*2.0*i/(2*i-1);}printf("%lf",sum);return 0…

计算机网络_2.2物理层下面的传输媒体

2.2物理层下面的传输媒体 一、传输媒体的分类二、导向型传输媒体1、同轴电缆2、双绞线3、光纤&#xff08;1&#xff09;光纤通信原理&#xff08;2&#xff09;光纤组成&#xff08;4&#xff09;多模光纤与单模光纤对比&#xff08;5&#xff09;光纤的波长与规格&#xff08…