C++基础算法排序篇

news2024/11/25 2:37:02

📟作者主页:慢热的陕西人

🌴专栏链接:C++算法

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

在这里插入图片描述

主要讲解C++算法中所涉及到的两个排序算法,快排和归并。

文章目录

    • Ⅰ.排序
      • Ⅰ. Ⅰ 快排
      • Ⅰ. Ⅱ 归并

Ⅰ.排序

Ⅰ. Ⅰ 快排

思路:

​ 平均时间复杂度:nlogn;

​ ①确定分界点:即选择一个标准值keykey的选取方法有q[l]q[(l + r) / 2], q[r],随机;

​ ②调整位置:将数组分为两个区间,前半部分区间都是q[i] <= key, 后半部分区间都是 q[i] >= key

​ ③递归处理左右两端的区间;

模板:

#include<iostream>

using namespace std;
const int N = 1e6 + 10;

int n;
int q[N];

void quick_sort(int q[], int l, int r)
{
    if(l >= r) return;
    
    int x = q[l], i = l - 1, j = r + 1;
    while(i < j)
    {
        do i++; while(q[i] < x);
        do j--; while(q[i] > x);
        if(i < j) swap(q[i], q[j]);
    }
   	quick_sort(q,l,j);
    	quick_sort(q,j + 1, r);
}

int main()
{
    scanf("%d", &n);
    for(int i = 0; i < n; ++i) scanf("%d", &q[i]);
	
    quick_sort(q,l,r);
    
    for(int i = 0; i < nl ++i) printf("%d ",q[i]);
    
    return 0;
}

注意:

​ 对于边界问题:

​ 当我们选择key为q[l]的时候,那么递归的时候边界就只能是:

    quick_sort(q,l,j);
    quick_sort(q,j + 1, r);

如果边界是如下所示的情况,就容易造成死递归,举例数组为1 2的情况:

这时候key就是1,那么如下条件就会变成左区间[0, -1], 右区间[0, 1]就会死递归了。

所以为了避免这种情况,当选取keyq[l]的时候选用上面的区间即可,当选取keyq[r]的时候我们选用下面的区间即可。

    quick_sort(q,l,i - 1);
    quick_sort(q,i, r);

Ⅰ. Ⅱ 归并

思路:

​ 时间复杂度:nlogn;

​ ①确定分界点mid = (l + r) / 2;

​ ②不断的将数组进行分解,直到分解为一个一个为一组为止。

​ ③将这些分解完的**有序**数组一个一个进行有序合并。

模板:

#include<iostream>

using namespace std;

const int N = 1000010;

int n;
int q[N], tmp[N];

void merge_sort(int q[], int l, int r)
{
 if (l >= r) return;
    
 int mid = (l + r) >> 1;
    //归类
 merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
    //合并
 int k = 0, i = l, j = mid + 1;
 while (i <= mid && j <= r)
     if (q[i] <= q[j]) tmp[k++] = q[i++];
     else tmp[k++] = q[j++];
 while (j <= r) tmp[k++] = q[j++];
 while (i <= mid) tmp[k++] = q[i++];
    
 for (i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];
}  
int main()
{
	int n;
 scanf("%d", &n);
 for(int i = 0; i < n; i++) scanf("%d", &q[i]);

 merge_sort(q, 0, n);

 for(int i = 0; i < n; i++) printf("%d ", q[i]);
	return 0;
}

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

在这里插入图片描述

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

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

相关文章

请问支付功能如何测试

目录 01测试思维 02支付功能的测试点 一&#xff1a;支付的分类&#xff1a; 二&#xff1a;功能测试 三&#xff1a;接口测试 四&#xff1a;安全测试 五&#xff1a;测试点 01测试思维 要分析测试点之前&#xff0c;我们先来梳理一下测试思维。总结来说&#xff0c;任…

字符串编程练习(C++)

ex1 字符串变形 描述 对于一个长度为 n 字符串&#xff0c;我们需要对它做一些变形。 首先这个字符串中包含着一些空格&#xff0c;就像"Hello World"一样&#xff0c;然后我们要做的是把这个字符串中由空格隔开的单词反序&#xff0c;同时反转每个字符的大小写。…

【java】IntelliJ IDEA创建helloworld

目录 一、安装jdk17 二、安装InterliJ IDEA 2023.1.4 三、创建项目 四、创建模块 五、创建包 六、创建类 七、开始hello world 7.1 输入 psvm 7.2 输入sout 八、运行 九、IDEA 设置 9.1 主题 9.2 字体 9.3 背景色 十、快捷键 十一、导入模块 11.1方式一 1、先…

如何在无人机支持下完成自然灾害风险评估的原理和方法

对灾害的损失进行估算与测算是制定防灾、抗灾、救灾 及灾后重建方案的重要依据。 自然灾害评估按灾害客观地发展过程可分三种&#xff1a;一是灾前预评估&#xff0c;二是灾期跟踪或监测性评估&#xff0c;三是灾后实测评估。 灾前预评估要考虑三个因素&#xff0c;第一是未来…

将 QtPropertyBrowser 加入到 vs2015 qt版中工程中

我是直接将QtPropertyBrowser的所有文件当子文件夹全部加入到工程里的 加完之后&#xff0c;ok&#xff0c;编译错误 出现一堆以下错误&#xff0c;我只拿出一条 moc_qtbuttonpropertybrowser.cpp(94): error C2027: 使用了未定义类型“QtButtonPropertyBrowserPrivate” 然…

二级市场负重前行?腾讯音乐的“新伤”与“旧患”

炎炎夏日的7月&#xff0c;于腾讯音乐&#xff08;NYSE:TME、HK:01698&#xff09;而言并不太平。 先是&#xff0c;在7月5日&#xff0c;企鹅FM发布官方公告称由于业务调整&#xff0c;将于9月6日正式停止运营。 仅过十二天&#xff0c;7月17日&#xff0c;腾讯音乐发布公告&…

【Vue】报错:this.$refs 引用子组件报错 is not a function

文章目录 报错信息解决方法 报错信息 this.$refs.selectTree.onHide is not a function 解决方法 确保组件成功导出并挂载&#xff1a; - 子组件需要 import,import 是请确保路径正确import selectTree from /components/select-tree; - import 之后还需要在父组件的 comp…

ES6新增运算符

?. 可选链运算符 一个对象的属性&#xff0c;如果这个属性是对象&#xff0c;它还有子属性&#xff0c;访问这个子属性&#xff0c;比如 var obj {a: {key: val}} console.log(obj.a.key) // val 如果属性不存在的时候&#xff0c;则有可能会报错。 var obj {key: val} c…

预处理详解(一)---预定义符号

文章目录 预定义符号预定义符号的使用 预定义符号 在C语言中&#xff0c;有一些有意思的预定义符号&#xff0c;这些预定义符号都是语言内置的&#xff0c;即以及定义好的&#xff0c;我们可以直接使用。预定义符号主要有以下几个&#xff1a; __FILE__ //进行编译的源…

Windows安装激活注意事项

选择语言、版本&#xff08;Windows 10指的是专业版本&#xff09;和体系结构&#xff08;32位/64位&#xff09;&#xff0c;这里自行根据情况选择&#xff08;如果机器预装的是Windows 10家庭中文版则选择家庭中文版&#xff0c;如果预装的是专业版则选择Windows 10。这样原先…

vue(html,css,vue2,vue3) 学习总结

文章目录 小白 Vue 3 学习一些名词软件安装 VSCode 中的一些设置1. 关闭eslint检查tsconfig.json 配置文件2. ts 文件引用报红 相对路径写法常见图片格式和区别目录结构JS/TS1. prototype(原型对象)2. 导入/导出3. 去除字符串两端空格4. 一些特殊语法糖5. 深拷贝6. 拼接两个数组…

openGauss学习笔记-14 openGauss 简单数据管理-查看对象

文章目录 openGauss学习笔记-14 openGauss 简单数据管理-查看对象14.1 查看命令帮助信息14.2 切换数据库14.3 查询所有数据库14.4 查询当前数据库中的所有表14.5 查看表结构 openGauss学习笔记-14 openGauss 简单数据管理-查看对象 gsql工具提供了若干高级特性&#xff0c;便于…

Linux 漏洞扫描

Linux 漏洞扫描程序会仔细检查基于 Linux 的系统&#xff0c;以减轻潜在的风险和漏洞。 什么是 Linux 漏洞扫描程序 Linux 漏洞扫描程序是一种专门的漏洞扫描工具&#xff0c;旨在识别基于 Linux 的系统中的安全漏洞和弱点,它会扫描配置错误、过时的软件版本和已知漏洞。 为…

UG\NX二次开发 捕获NX OPEN C++异常,乱码问题

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 捕获NX OPEN C++异常,乱码问题。 效果: 使用uc1601(ex.what(),1)显示乱码 使用 NXMessageBox()->Show("Block Styler", NXMessageBox::DialogTypeError, ex…

Selenium(3 + 4 超级详细笔记)

文章目录 selenium&#xff08;web自动化测试&#xff09;1. selenium初始化&#xff08;2种&#xff09;2. chrome 启动参数&#xff08;3种&#xff09;3. 八大定位方式3.1 css 定位3.2 xpath 定位3.3 link_text 定位3.4 partial_link_text 定位3.5 relative 相对定位 4. 添加…

uniapp动态获取列表中每个下标的高度赋值给另一个数组(完整代码附效果图)

uniapp实现动态获取列表中每个下标的高度&#xff0c;赋值给另一个数组。 先看效果图&#xff1a; 完整代码&#xff1a; <template><div class""><div class"">我是A列表&#xff0c;我的高度不是固定的</div><div class&qu…

DDOS百科:什么是 DDoS 攻击及如何防护DDOS攻击

一、什么是 DDoS 攻击&#xff1f; 当多台机器一起攻击一个目标&#xff0c;通过大量互联网流量淹没目标或其周围基础设施&#xff0c;从而破坏目标服务器、服务或网络的正常流量时&#xff0c;就会发生分布式拒绝服务(DDoS)攻击。 DDoS允许向目标发送指数级更多的请求&#…

Revit 导出明细表的两种方法!

方法一、Revit中怎么灵活运用明细表格式的导出与导入 在做项目的时候&#xff0c;遇到一些项目需要进行工程量统计的时候&#xff0c;经常需要设置明细表里面的格式&#xff0c;例如字体、表格排布样式等&#xff0c;但是项目一旦多起来&#xff0c;这些工作重复性又太高&#…

云计算和云架构是什么 有什么用途?

云计算是一种基于互联网的计算方式&#xff0c;它通过网络将计算资源(如计算能力、存储、网络带宽等)以服务的形式提供给用户&#xff0c;并允许用户根据需求进行灵活的资源调配和管理。云计算通常分为三个层次&#xff0c;即基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服…

如何快速爬取国内985大学学术学报pdf文件

背景 最近&#xff0c;在爬取关于国内985大学的学报时&#xff0c;我注意到大部分大学学报站点格式都采用相似的形式&#xff0c;并且PDF链接都使用自增的ID。然而&#xff0c;我也发现了一个问题&#xff0c;即大多数PDF链接的ID并不是连续的。现在我将向你分享一些方法&…