分治法之归并排序

思路:

  1. 将待排序数组分成两个子数组,计算中间位置mid。
  2. 对左半部分进行递归排序,得到一个有序的子数组。
  3. 对右半部分进行递归排序,得到另一个有序的子数组。
  4. 合并两个有序的子数组,得到一个完整的有序数组。

示例图:

代码:

#include<iostream>
using namespace std;void merge(int arr[], int start1, int end1, int start2, int end2){//左边数组的长度int n1 = start1 - end1 + 1;//右边数组的长度int n2 = start2 - end2 + 1;//定义左右两个子数组int* arr_left = new int[n1];int* arr_right = new int[n1]; //从原数组中复制左边的数组for(int i = 0; i < n1; i++) left_arr[i] = arr[start1 + i];//从原数组中复制右边的数组for(int i = 0; i < n2; i++) right_arr[i] = arr[start2 + i];//指向左右两个数组首元素的指针int left = 0, right = 0;//临时数组,存放合并后的数组int p = start1;//左右两个数组不为空while(left < n1 && right < n2){//左边数组的元素小于右边数组的元素if(arr_left[left] < arr_right[right]){//将左边数组的值存入临时数组,同时两指针右移一位arr[p++] = arr_left[left++];}//右边的数组为空while(left < n1){//将左边数组的值存入临时数组,同时两指针右移一位arr[p++] = arr_left[left++];}//左边的数组为空while(right < n2){//将右边数组的值存入临时数组,同时两指针右移一位arr[p++] = arr_right[right++];}}mergesort(int arr[], int start, int end){//当数组长度小于等于1时直接返回数组
if(start >= end){return;}//取数组的中间位置
int mid = (start + end) / 2;//对左边的数组进行递归排序
mergesort(arr, start, mid);//对右边的数组进行递归排序
mergesort(arr,mid + 1, end);//递归的的两个数组进行合并
merge(arr, start, mid, mid + 1, end);}int main(){//定义数组int arr[] = {8, 1, 3, 2, 9, 7, 6, 5, 4};//数组长度int n = sizeof(arr) / sizeof(arr[0]);//调用递归数组mergesort(arr, 0, n - 1);//打印数组for(int i = 0; i < n; i++){cout << arr[i] << " ";}return 0;}

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

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

相关文章

JAVA 算法面试总结

1、二分查找 二分查找又叫折半查找&#xff0c;要求待查找的序列有序。每次取中间位置的值与待查关键字比较&#xff0c;如果中间位置 的值比待查关键字大&#xff0c;则在前半部分循环这个查找的过程&#xff0c;如果中间位置的值比待查关键字小&#xff0c; 则在后半部分循环…

【ONE·Linux || 网络基础(四)】

总言 主要内容&#xff1a;传输层UDP、TCP协议基本介绍。UDP报文格式、TCP报文格式、三次握手四次挥手、TCP可靠性策略说明。 文章目录 总言8、UDP协议&#xff08;传输层一&#xff09;8.1、传输层预备知识8.1.1、端口号8.1.2、一些指令&#xff08;netstat、pidof、xargs&am…

linux 内核工作队列

工作队列&#xff08; work queue&#xff09;是使用内核线程异步执行函数的通用机制。 工作队列是中断处理程序的一种下半部机制&#xff0c;中断处理程序可以把耗时比较长并且可能睡眠的函数交给工作队列执行。 工作队列不完全是中断处理程序的下半部。内核的很多模块需要异步…

android NDK相关,调用C库,JNI,交叉编译,跨平台

首先就是库给我&#xff0c;我先进行开发&#xff08;按照文档&#xff09;&#xff0c;最后进行交叉编译ARM平台。 遇到的问题&#xff1a;我要看到代码效果&#xff0c;所以必须要在真机上跑代码&#xff0c;那么我调用的库就必须是我这个平台适用的&#xff0c;有两种方式&…

热烈欢迎省工信厅毛郑建处长莅临公司调研指导工作

2023年11月28日&#xff0c;河南省工信厅信息化和软件服务业处毛郑建处长莅临郑州埃文计算机科技有限公司&#xff08;以下简称“埃文科技”&#xff09;调研考察工作。河南省工业信息安全产业发展联盟理事长任传军陪同调研。 首先&#xff0c;埃文科技董事长王永向毛处长介绍埃…

保存防火墙的规则和自定义链

保存防火墙的规则 将iptables的规则导入开机自启的文件里做脚本使用&#xff0c;就算iptables -F删除&#xff0c;重启就能恢复了 iptables-save #查看当前的所有规则 iptables -save > 保存规则的文件 #保存规则 iptables -restore < 保存的规则文件#重新导入规则 在当…

优维全新低碳产品亮相SBE23 Asia-Pacific绿色建筑促进碳中和论坛

2023年11月23日—24日&#xff0c;由深圳市人民政府主办&#xff0c;深圳市住房和建设局、深圳市发展与改革委员会、深圳市龙岗区人民政府承办&#xff0c;深圳市绿色建筑协会作为执行单位的“2023年可持续建筑环境亚太地区会议&#xff08;SBE23 Asia-Pacific&#xff09;”在…

Ubuntu Server 20.04.6安装Anaconda3

下载安装包 去下面的网页找到自己想要安装的对应版本的链接&#xff1a; https://repo.anaconda.com/archive/ 我安装的版本链接如下&#xff1a; https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 复制这个链接后使用如下命令下载&#xff1a; wget …

一篇文章带你掌握MongoDB

文章目录 1. 前言2. MongoDB简介3. MongoDB与关系型数据库的对比4. MongoDB的安装5. Compass的使用6. MongoDB的常用语句7. 总结 1. 前言 本文旨在帮助大家快速了解MongoDB,快速了解和掌握MongoDB的干货内容. 2. MongoDB简介 MongoDB是一种NoSQL数据库&#xff0c;采用了文档…

react hooks学习之useMemo和useCallback

useMemo和useCallback的用法以及区别 useCallback 和 useMemo 是 React 中的两个钩子函数&#xff0c;它们的目标都是优化性能&#xff0c;但它们在用途和使用场景上有一些区别。 useCallback useCallback 用于缓存一个回调函数&#xff0c;并在依赖项发生变化时&#xff0c…

arthas使用

官方文档 Github: https://github.com/alibaba/arthas 文档: https://arthas.aliyun.com/doc/ Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断…

C语言从入门到实战——常用字符函数和字符串函数的了解和模拟实现

常用字符函数和字符串函数的了解和模拟实现 前言1. 字符分类函数2. 字符转换函数3. strlen的使用和模拟实现4. strcpy的使用和模拟实现5. strcat的使用和模拟实现6. strcmp的使用和模拟实现7. strncpy函数的使用8. strncat函数的使用9. strncmp函数的使用10. strstr的使用和模拟…

Json示例

这里写目录标题 CjsonC JSonQT json Cjson #include <stdio.h> #include <stdlib.h> #include "cjson.h" // 向JSON对象中添加数据 cJSON_AddStringToObject(root, "name", "John"); cJSON_AddNumberToObject(root, "age&…

Redis 数据恢复方式说明

AOF日志 AOF(Append Only File)是写后日志,Redis先执行命令把数据写入内存,然后才记录日志。 实现原理 AOF 里记录的是 Redis 收到的每一条命令,这些命令是以文本形式保存的。 示例: set testkey testvalue 对应AOF文件 *3 $3 set $7 testkey $9 testvalue “*3”表示…

MatchPyramid实现文本匹配

引言 今天利用MatchPyramid实现文本匹配。 原论文解析→点此←。 MatchPyramid 核心思想是计算两段文本间的匹配矩阵&#xff0c;把它当成一个图形利用多层卷积网络提取不同层级的交互模式。 匹配矩阵是通过计算两段输入文本基本单元(比如字或词)之间相似度得到的&#xf…

【0241】Parser解析分析统计信息(PARSE ANALYSIS STATISTICS)

1. 执行解析分析 PG内核通过调用pg_parse_query()函数,完成用户查询字符串的解析任务。并返回List类型的参数parsetree_list。如下所示: $4 = {type = T_List, length = 1, max_length = 1, elements = 0x1fc72e0, initial_elements = 0x1fc72e0}之后运行原始解析树并处理每…

Java作业题记录

loading... 1.定义一个Person类{name, age, job},初始化Person对象数组&#xff0c;有3个person对象&#xff0c;并按照 age 从 大到 小进行排序,提示&#xff0c;使用冒泡排序Homework01.java 难点1&#xff1a;初始化数组Person[] people new Person[3]; 难点2&#xff…

43.0BaseDao抽取dao公共父类

43.1. 回顾 1. 把数据库表中查询的结果封装到一个实体类中。 命名规则:类名和表名一致 类中属性和表的字段对应。 表中的一条记录对应实体的一个对象 多条记录→集合 43.2. 正文 目录 43.1. 回顾 43.2. 正文 43.3. 抽取dao公共父类。 43.4. 引入数据源 43.3. 抽取dao公共…

C#测试开源运行耗时库MethodTimer.Fody

微信公众号“dotNET跨平台”的文章《一个监控C#方法运行耗时开源库》介绍了支持测量方法耗时的包MethodTimer.Fody&#xff0c;使用方便&#xff0c;还可以自定义输出信息格式。本文学习并测试MethodTimer.Fody包的使用方式。   新建控制台程序&#xff0c;通过Nuget包管理器…

Python链式调用技巧:代码流畅无缝连接

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 链式调用是一种编程风格&#xff0c;它允许将多个方法调用连接在一起&#xff0c;形成一个连贯的操作链。在Python中&#xff0c;链式调用常常用于使代码更简洁、易读&#xff0c;尤其在处理数据处理和函数式编程…