分治算法归并排序

分治算法

基本概念

把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

分治法的基本步骤

分治法在每一层递归上都有三个步骤:

step1分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
step2解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
step3合并:将各个子问题的解合并为原问题的解。

归并排序

归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治)策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码如下:

#include <iostream>
using namespace std;const int N = 1e4 + 10;
int is1[N], is2[N]; // `is1` 为主数组,`is2` 为辅助数组// 合并两个有序子数组的函数
void merge(int low, int mid, int high) {int i = low, j = mid + 1, k = low; // 初始化 i, j, k 指针// 合并两个有序子数组while (i <= mid && j <= high) {if (is1[i] < is1[j]) {is2[k++] = is1[i++]; // 左子数组元素更小,拷贝到辅助数组}else {is2[k++] = is1[j++]; // 右子数组元素更小,拷贝到辅助数组}}// 处理左子数组剩余元素while (i <= mid) {is2[k++] = is1[i++];}// 处理右子数组剩余元素while (j <= high) {is2[k++] = is1[j++];}// 将辅助数组中的合并结果拷贝回主数组for (int i = low; i <= high; i++) {is1[i] = is2[i];}
}// 归并排序递归函数
void mergesort(int l, int r) {if (l >= r) {return; // 如果子数组长度为1或无效,直接返回}int mid = (l + r) >> 1; // 计算中间索引mergesort(l, mid);      // 递归排序左半部分mergesort(mid + 1, r);  // 递归排序右半部分merge(l, mid, r);       // 合并两个有序子数组
}int main() {int n;cin >> n; // 输入数组长度// 输入数组元素for (int i = 1; i <= n; i++) {cin >> is1[i];}// 归并排序mergesort(1, n);// 输出排序后的数组for (int i = 1; i <= n; i++) {cout << is1[i] << ' ';}cout << endl;return 0;
}

代码模板

// 合并排序函数
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;int tmp[r - l + 1]; // 临时数组大小为当前处理的子数组大小// 合并两个已排序的子数组while (i <= mid && j <= r)if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ]; // 将较小的元素放入临时数组else tmp[k ++ ] = q[j ++ ]; // 将较小的元素放入临时数组// 将左半部分剩余的元素添加到临时数组while (i <= mid) tmp[k ++ ] = q[i ++ ];// 将右半部分剩余的元素添加到临时数组while (j <= r) tmp[k ++ ] = q[j ++ ];// 将临时数组中的元素复制回原数组for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}

代码链接gitee

归并排序的时间复杂度为O(nlogn)

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

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

相关文章

Linux内核(Kernel)启动过程分析

文章目录 Linux内核&#xff08;Kernel&#xff09;启动过程一、内核启动的基本流程1. 启动加载程序 (Bootloader)2. 内核解压阶段3. 内核启动&#xff08;Kernel Startup&#xff09;4. start_kernel函数5. 启动初始进程 二、内核文件加载及解压缩1.为什么是压缩文件2.文件类型…

找搭子是什么意思?有没有找搭子的平台?靠谱找搭子软件推荐!

“找搭子” 指寻找在特定活动或兴趣方面有共同爱好的伙伴。比如饭搭子一起吃饭&#xff0c;运动搭子共同健身。它满足人们在特定场景下的社交需求&#xff0c;让生活更丰富有趣&#xff0c;是一种新型社交方式。以下是国内排名靠前的找搭子平台 1. 咕哇找搭子小程序&#xff1a…

Bio-Linux-shell详解-2-基本Shell命令快速掌握

Bio-Linux-shell详解-1-从0开始-CSDN博客 想了解基本知识可以先看上文&#xff0c;本次我们讲述一些Shell的基本命令。 目录 1.shell输入命令 2.man命令查看说明文档 3.文件查看命令 &#xff08;1&#xff09;linux文件结构 &#xff08;2&#xff09;cd切换工作目录 &…

SOCKS4和SOCKS5的区别是什么?

SOCKS4和SOCKS5是两种常用的网络代理协议&#xff0c;它们在功能、性能和应用场景上存在一些关键的区别。以下是对这两种协议区别的详细解析&#xff1a; 1. 支持的协议类型 SOCKS4&#xff1a;只支持TCP协议&#xff08;传输控制协议&#xff09;。这意味着SOCKS4代理只能用…

春秋云境靶场之CVE-2022-29464

一.靶场环境 1.下载靶场 根据题目提示&#xff0c;存在文件上传漏洞 2.启动靶场 打开之后&#xff0c;页面显示 然后就跳转到一个登录页面 二.登录页面 1.尝试登录 我们尝试弱口令登录admin,admin&#xff0c;跳转到连接超时页面 当我们再次点击这个链接后&#xff0c;就会…

旋转链表问题(python3)

旋转链表 问题描述解题思路代码实现 问题描述 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3] 链表中节点的数目在范围 [0, 500] 内-100 < Node.va…

队列-------

队列总览 队列的定义 队列的基本操作 队列回顾 顺序队列总览 队列的顺序实现 队列的初始化 入队操作&#xff0c;rear&#xff0c;后面的&#xff0c;下一个队列元素要插入的位置。front&#xff0c;前面的&#xff0c;当前队列的第一个元素。 循环队列入队操作 循环…

基于windows的mysql5.7安装配置教程

目录 0.写在前面的话 1.下载安装包 2.进行目录选择和解压操作 3.配置环境变量 4.创建my.ini文件 5.管理员运行终端 6.安装mysqld 7.初始化数据库 8.启动mysql服务 9.进入mysql管理终端 10.修改root密码 11.刷新权限 12.注销内容 13.重启mysql 14.输入密码测试 1…

17、Python如何读写文本文件

Python2与Python3文件读写的差异 在Python 2和Python 3之间&#xff0c;文件读写操作存在显著差异&#xff0c;主要是因为字符串的语义发生了变化。 python 2.x&#xff1a;写入文件前对unicode编码&#xff0c;读入文件后对二进制字符串解码。python 3.x&#xff1a;open函数…

【AI视频】AI虚拟主播制作初体验:从生成数字人到视频创作全流程

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI视频 | AI数字人 文章目录 &#x1f4af;AI虚拟主播&#x1f4af;使用AI绘画工具生成数字人借助GPT生成数字人所需的提示词方案一&#xff1a;使用Midjourney生成数字人方案二&#xff1a;使用TensAI生成数字人补充方案三&…

MoneyPrinterTurbo 安装使用流程

项目地址&#xff1a; https://github.com/harry0703/MoneyPrinterTurbo 开发环境&#xff1a;mac 1 git 下载 # 下载代码到本地 git clone https://github.com/harry0703/MoneyPrinterTurbo.git cd MoneyPrinterTurbo2 docker 配源 在 docker 安装目录执行以下命令显示隐藏…

[Java]maven从入门到进阶

介绍 apache旗下的开源项目,用于管理和构建java项目的工具 官网: Welcome to The Apache Software Foundation! 1.依赖管理 通过简单的配置, 就可以方便的管理项目依赖的资源(jar包), 避免版本冲突问题 优势: 基于项目对象模型(POM),通过一小段描述信息来管理项目的构建 2…

数据中心可视化管理平台:提升运维效率

通过图扑可视化平台实时监控设备状态、能耗和网络流量&#xff0c;帮助运维团队快速识别和处理异常&#xff0c;提高运营效率&#xff0c;确保系统稳定与可靠性。

SPI--原理

SPI–原理 前言: 若对 SPI 通讯协议不了解&#xff0c;可先阅读《SPI 总线协议介绍》文档的内容学习。 关于 FLASH 存储器&#xff0c;请参考“常用存储器介绍”章节&#xff0c;实验中 FLASH 芯片的具体参数&#xff0c;请参考 其规格书《W25Q64》来了解。 大纲 SPI协议S…

glb数据格式

glb数据格式 glb 文件格式只包含一个glb 文件&#xff0c;文件按照二进制存储&#xff0c;占空间小 浏览 浏览glb工具的很多&#xff0c;ccs&#xff0c;3D查看器等都可以&#xff0c;不安装软件的话用下面网页加载就可以&#xff0c;免费 glTF Viewer (donmccurdy.com) glb…

Makefile 学习笔记(一)gcc编译过程

环境准备 .linux 系统(虚拟机) VS code linux 编译过程 预处理: 把.h .c 展开形成一个文件.宏定义直接替换 头文件 库文件 .i 汇编&#xff1a; .i 生成一个汇编代码文件 .S 编译&#xff1a; .S 生成一个 .o .obj 链接: .o 链接 .exe .elf gcc c语言 g c语言 gcc的使用 …

MySQL之表内容的增删改查(含oracel 9i经典测试雇佣表下载)

目录 一:Create 二:Retrieve 1.select列 2.where条件 3.结果排序 4. 筛选分页结果 三:Update 四:Delete 1.删除数据 2. 截断表 五&#xff1a;插入查询结果 六&#xff1a;聚合函数 七:group by子句的使用 表内容的CRUD操作 : Create(创建), Retrieve(读取)…

数据结构之栈(python)

栈&#xff08;顺序栈与链栈&#xff09; 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作&#xff08;包含入栈和出栈&#xff09;2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…

吐血整理资料后,测试面试相关的资料大全

最近假期收集资料的过程真的让我吐血。 在博客上随便搜一点资料&#xff0c;好多只能看一般&#xff0c;或者打着分享资源&#xff0c;但实际上并不是了。而且大部分资料就是网上找的&#xff0c;恰饭不好评价&#xff0c;但体验真的好差啊&#xff01; 我搜集了很多面试资料…

流程图怎么画?3个好用的在线流程图软件推荐,绘图没烦恼!

目录 什么是流程图&#xff1f; 为什么需要使用流程图&#xff1f; 流程图中各种图形的含义 如何制作流程图&#xff1f; 小结&#xff1a;流程图如何制作&#xff1f; 流程图是表达工作流程或者系统操作过程的有效工具&#xff0c;被广泛应用于各个行业和领域。…