归并排序和分治

归并排序

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

分而治之

可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。

过程:左部分排好序,右部分排好序,利用merge过程让左右整体有序(merge过程:谁小拷贝谁,直到左右两部分所有的数字耗尽)

归并排序算法有两个基本的操作,一个是,也就是把原数组划分成两个子数组的过程。另一个是,它将两个有序数组合并成一个更大的有序数组。

  1. 将待排序的线性表不断地切分成若干个子表,直到每个子表只包含一个元素,这时,可以认为只包含一个元素的子表是有序表。
  2. 将子表两两合并,每合并一次,就会产生一个新的且更长的有序表,重复这一步骤,直到最后只剩下一个子表,这个子表就是排好序的线性表。

阶段

可以理解为就是递归拆分子序列的过程,利用二分法

递归深度为log2n。

合并两个有序数组流程

再来看看阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。

代码:

# include <stdio.h>int arr[100];
inr help[100];int n;void mergesort(int l, int r)
{if (l == r)return;int m = (l+r) / 2;mergesort(l, m);mergesort(m+1, r);merge(l, m, r); //让左右整体有序 
}//让 l 到 r 变 有序
//把[l, m] 和 [m+1, r]进行合并 
void merge(int l, int m, int r)
{int i = l;int a = l;int b = m+1; while (a <= m && b <=r){if (arr[a] <= arr[b]){help[i] = arr[a];a = a + 1;}else{help[i] = arr[b];b = b + 1;}i = i + 1;}//左侧指针,右侧指针,必有一个越界,另一个不越界while (a <= m){help[i] = a;i = i + 1;a = a + 1;} while (b <= r){help[i] = b;i = i + 1;b = b + 1;} 	for (int i=l; i<=r; ++i){arr[i] = help[i];}
}int main()
{scanf("%d", &n);for (int i=0; i<n; ++i)scanf("%d", &arr[i]);mergesort(0, n-1);}

归并分治



问题一

本题发现

符合第一个原理

在计算跨越左右产生的答案时,我们发现如果左、右各有序,则会提高计算便利性

因此就可以考虑归并分治

代码:

# include <stdio.h>int arr[100];
int help[100];int n;int sum(int l, int r)
{if (l == r)return 0;int m = (l + r) / 2;return sum(l, m) + sum(m+1, r) + merge(l, m, r);
}int merge(int l, int m, int r)
{int ans = 0;int j = l;int sum = 0;for (int i=m+1; i<r; ++i){while (j <= m && arr[i] >= arr[j]){sum = sum + arr[j];j = j + 1;}ans = ans + sum;}int i = l;int a = l;int b = m + 1;while (a <= m && b <=r){if (arr[a] <= arr[b]){help[i] = arr[a];a = a + 1;}else{help[i] = arr[b];b = b + 1;}i = i + 1;}//左侧指针,右侧指针,必有一个越界,另一个不越界while (a <= m){help[i] = a;i = i + 1;a = a + 1;} while (b <= r){help[i] = b;i = i + 1;b = b + 1;} 	for (int i=l; i<=r; ++i){arr[i] = help[i];}
}int main()
{scanf("%d", &n);for (int i=0; i<n; ++i)scanf("%d", &arr[i]);int ans = sum(0, n-1);}

问题二

符合第一个原理

在计算跨越左右产生的答案时,我们发现如果左、右各有序,则会提高计算便利性

因此就可以考虑归并分治

代码:

# include <stdio.h>int arr[100];
int help[100];int n;int cmp(int l, int r)
{if (l == r)return 0;int m = (l+r) / 2;return cmp(l, m) + cmp(m+1, r) + merge(l, m, r);
}int merge(int l, int m, int r)
{int j = l;int q = m+1;int sum = 0;int ans = 0;for (int i=l; i<=m; ++i){while (q <= r && arr[i] > arr[q] * 2){q = q + 1;}ans = ans + (q - m - 1) - i;}int x = l;int a = l;int b = m + 1;while (a <= m && b <=r){if (arr[a] <= arr[b]){help[x] = arr[a];a = a + 1;}else{help[x] = arr[b];b = b + 1;}x = x + 1;}//左侧指针,右侧指针,必有一个越界,另一个不越界while (a <= m){help[x] = a;x = x + 1;a = a + 1;} while (b <= r){help[x] = b;x = x + 1;b = b + 1;} 	for (int i=l; i<=r; ++i){arr[i] = help[i];}return ans;
}int main()
{scanf("%d", &n);for (int i=0; i<n; ++i)scanf("%d", &arr[i]);}

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

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

相关文章

书生浦语全链条开源开放体系

开放了高质量语料数据 预训练 微调 评测 评测框架 部署 智能体 例如把openlab对于计算机视觉的封装

LeetCode-894. 所有可能的真二叉树【树 递归 记忆化搜索 动态规划 二叉树】

LeetCode-894. 所有可能的真二叉树【树 递归 记忆化搜索 动态规划 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;分治&#xff0c;递归解题思路二&#xff1a;动态规划。关键思路是如果构造节点数目为 n 的真二叉树&#xff0c;此时可以从节点数目序列为 [(1,n−2),(3,…

Linux网络编程二(TCP图解三次握手及四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

文章目录 1、TCP三次握手(1) 第一次握手(2) 第二次握手(3) 第三次握手 2、TCP四次挥手(1) 一次挥手(2) 二次挥手(3) 三次挥手(4) 四次挥手 3、TCP滑动窗口4、TCP状态时序图5、多进程并发服务器6、多线程并发服务器 1、TCP三次握手 TCP三次握手(TCP three-way handshake)是TCP协…

选择SD-WAN带宽时需要考虑什么?

部署SD-WAN之前&#xff0c;企业需要考虑关系到带宽大小的一系列因素&#xff0c;以确保其网络能够满足业务需求并保持高效运行。以下是一些在确定SD-WAN带宽时需要考虑的关键因素&#xff1a; 企业规模和用户数量&#xff1a; 企业规模和用户数量是决定带宽需求的重要因素之一…

Vue的前世今生与安装配置

vue的前世今生 Vue.js是一个流行的前端JavaScript框架&#xff0c;用于构建用户界面与单页应用程序&#xff08;SPA&#xff09;。它的诞生和发展可以概括为以下几个重要阶段&#xff1a; 初创阶段&#xff1a;Vue由中国人尤雨溪&#xff08;Evan You&#xff09;创建于2014年…

人工智能聊天机器人都有哪些?分享3款神奇的软件!

在数字化浪潮中&#xff0c;人工智能聊天机器人以其独特的魅力和实用性&#xff0c;逐渐成为我们生活中不可或缺的一部分。它们能够与用户进行智能互动&#xff0c;提供多元化的服务&#xff0c;让我们的生活更加便捷和高效。那么&#xff0c;市场上究竟有哪些领先的人工智能聊…

智能停车场物联网远程监控解决方案

智能停车场物联网远程监控解决方案 智能停车场物联网远程监控解决方案是一种集成了现代物联网技术、大数据分析以及云计算等先进技术手段&#xff0c;对停车场进行全面智能化管理的综合系统。它通过实时感知、精准采集和高效传输各类停车数据&#xff0c;实现对停车场运营状态…

springcloud基本使用二(远程调用)

创建两个springboot maven子项目 子项目名称分别为order-server和user-server 配置user-server子项目: 所需依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependenc…

站群CMS系统

站群CMS系统是一种用于批量建立和管理网站的内容管理系统&#xff0c;它能够帮助用户快速创建大量的网站&#xff0c;并实现对这些网站的集中管理。以下是三个在使用广泛的站群CMS系统&#xff0c;它们各具特色&#xff0c;可以满足不同用户的需求。 1. Z-BlogPHP Z-BlogPHP是…

4年经验来面试20K的测试岗,一问三不知,我还真不如去招应届生。

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

vue使用i18n

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;前端 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#x…

力扣热题100_链表_141_环形链表

文章目录 题目链接解题思路解题代码 题目链接 141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

2024年网络安全运营体系建设方案

以下是部分WORD内容&#xff0c;请您参阅。如需下载完整WORD文件&#xff0c;请前往星球获取&#xff1a; 网络安全运营监控工作整体构想 工作目标及原则 工作目标 为进一步落实强化公司网络安全保障&#xff0c;有效支撑公司数字化转型战略&#xff0c;建立健全公司网省两级协…

HCIP(DSVPN)实验

HCIP&#xff08;DSVPN&#xff09;实验 一&#xff0c;实验要求&#xff1a; 1、r5为isp&#xff0c;只能进行ip地址的配置&#xff0c;其所有ip地址均为共有ip地址 2、r1和r5使用ppp的PAP认证&#xff0c;r5为主认证方 r2和r5之间使用ppp的chap认证&#xff0c;r5为主认证方…

数学公式——蓝桥杯赛题

题目信息 解题代码 def isintersect(k1, b1, k2, b2):# 如果两条直线的斜率不相等&#xff0c;则它们必定相交if k1 ! k2:return Trueelse:return False# 定义一个函数getpoint&#xff0c;用于计算两条直线交点的坐标 def getpoint(k1, b1, k2, b2):# 使用直线交点公式计算交…

电机的工作电流怎么计算?

电机的工作电流计算通常需要考虑多个因素&#xff0c;包括电机的额定功率、工作电压、效率以及负载情况等。以下是一个基本的计算方法&#xff0c;用于估算直流电机或交流电机在特定条件下的工作电流。 了解电机参数 额定功率 (P_rated) 电机的额定功率是指在额定工作条件下&am…

基于Websocket的局域网聊天系统

1.1 研究背景及意义 本项目所对应领域的研究背景及意义[1]。新冠肺炎局域网通信发生以来&#xff0c;大数据、云计算、人工智能等新一代信息技术加速与交通、局域网通信、教育、金融等领域深度融合&#xff0c;让局域网通信防控的组织和执行更加高效&#xff0c;成为战“疫”的…

Spring源码基础解析

这里写目录标题 Spring从哪开始&#xff1f;Spring的基本运行BeanFactoryPostProcessor与BeanPostProcessor的区别BeanFactoryPostProcessor用来处理bean的定义信息BeanDefinitionBeanPostProcessor用来处理Bean对象&#xff08;包含实例化与初始化&#xff09; Environment Sp…

Mac下Docker Desktop starting的解决方法

记录下自己在新增了一个新的容器后&#xff0c;Disk Size过大导致启动Docker Desktop会一直卡在Docker Desktop starting&#xff0c;并且重启无效的解决方法。该方法无需重新卸载&#xff0c;并且能保留原有的镜像和容器。 一、确认问题 首先确认Docker.raw大小以确认是否和笔…

manacher算法

回文串的性质 回文串类似于ABA&#xff0c;ABCBA,AABBAA等的对于i具有s[i]s[n!-i]的字符串。 回文半径&#xff1a;对于一个回文中心i&#xff0c;如果它的半径为r&#xff0c;如果它为奇数长度的回文串的中心&#xff0c;则说明[ir1,ir-1]为一个回文串。如果i是偶数长度的回…