算法设计与分析——递归与分治——归并排序

合并排序/归并排序(递归与分治)-算法设计与分析 const int maxn=100; int a[maxn]; void Merge_Array(int l,int r) {     int m=(l+r)>>1;     int i=l,j=m+1,n=r;     int k=0;     int tmp[maxn];     while(i     {         if(a[i]a[j])tmp[k++]=a[i 阅读详情

归并排序采用的是一种分治的思想,如下图,先将要排序的元素分为两块,每个块又开始分裂,然后逐个按照特定顺序合并,合成最后我们需要的数组。
归并排序的复杂度:
时间复杂度:O(nlogn)
空间复杂度:O(n)
最好情况和最坏情况都是O(nlogn)
是一种稳定的排序方法,因为在合并的同时保证了如果相同大小,左边的会先放进去

合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序,合并排序也叫归并排序。

在这里插入图片描述

函数:
MergeSort()实现了归并排序
Merge()函数 实现了将两个段合并到一起
Copy()函数实现了将一个段复制到另一个段中去

#include<bits/stdc++.h>
using namespace std;

vector<int> vec;
void copy(vector<int> &nums, vector<int> &vec, int left, int right);
void Merge(vector<int> &nums, vector<int> &vec, int left, int mid, int right);

void MergeSort(vector<int> &nums,int left,int right)
{
    if(left<right)
    {
        int mid = (left + right) / 2;
        MergeSort(nums, left, mid);
        MergeSort(nums, mid + 1, right);
        Merge(nums, vec, left, mid, right);
        copy(nums, vec, left, right);
    }
    
}

void Merge(vector<int> &nums,vector<int> &vec,int left,int mid,int right)
{
    int i=left, j=mid+1;
    while (i <= mid&&j <=right)
    {
        if(nums[i]<nums[j])
        {
            vec.push_back(nums[i]);
            i++;
        }
        else
        {
            vec.push_back(nums[j]);
            j++;
        }
        
    }
    while(i<=mid)
        {
            vec.push_back(nums[i]);
            i++;
        }
        while(j<=right)
        {
            vec.push_back(nums[j]);
            j++;
        }
}

void copy(vector<int> &nums,vector<int> &vec,int left,int right)
{
  int i = left;
    int k = vec.size();
    for (int tempK = 0;((tempK < k)&&(i<=right));tempK++) {
		nums[i] = vec[tempK];
		i++;
	}
    vec.clear();
}



int main()
{

    vector<int> num1 = {5,4,6,3,1,2,8,7,10};
	cout << "before sort " << endl;
	for (auto a:num1) {
		cout << a << "   ";
	}
    MergeSort(num1, 0, 8);
    cout << endl << "after sort " << endl;
	for (auto b:num1) {
		cout << b<< "   ";
	}
	system("pause");
	return 0;
}

在这里插入图片描述

分治与递归 分治与递归 递归是一种方法; 分治是一种思想; 分治可以用递归来实现,也可以不用递归 普通分治:分治的各个层次的各解决方案不同 递归分治:分治的各个层次的解决方案相同 分治 分治的基本思想 分治算法是将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。 由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。 在这种情况下, 阅读详情

相关推荐

分治与递归(算法分析)

分治 分治思想即:通过解决紧密相关的若干子问题来达到解决整个问题的目的 。 一般步骤为: 分解(divide):将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。 解决(conquer):递归地求解出子问题,若子问题的规模足够小,则直接求解。 合并(combine):将子问题的解组合成原问题的解。 (有时除了与原问题形式完全一样的规模更小的子问题外,还需要求解与原问题不完全一样的子问题,我们将这些子问题的求解归为合并步骤的一部分。) 递归与分治是紧密相关的,使用递归式可以很自然地刻画分治

Shao_yihao的博客 754

算法设计与分析--递归与分治

c++算法 递归与分治 一些习题

m0_67522539的博客 2042

[排序算法] 9. 归并排序递归与非递归实现及算法复杂度分析(分治算法、归并排序、复杂度分析)

文章目录1. 基本思想2. 代码实现2.1 递归实现2.2 优化—非递归实现3. 性能分析 1. 基本思想 在数列排序中,如果只有一个数,那么它本身就是有序的;如果只有两个数,那么一次比较就可以完成排序。也就是说,数越少,排序越容易。那么,如果有一个由大量数据组成的数列,我们很难快速地完成排序,该怎么办呢?可以考虑将其分解为很小的数列,直到只剩一个数时,本身已有序,再把这些有序的数列合并在一起,执行一个和分解相反的过程,从而完成整个数列的排序。 归并排序与快速排序的思想基本一致,唯一不同的是归并排序的基准值是数组的中间元素 快排 Link:[排序算法] 6. 快速排序多种递归、非递归实现及性能

算法设计与分析:递归与分治策略

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。为了完成本关任务,你需要掌握:递归的基本思想,快速排序的方法。请仔细阅读右侧代码,根据方法内的提示,在。请仔细阅读右侧代码,根据方法内的提示,在。请仔细阅读右侧代码,根据方法内的提示,在。开始你的任务吧,祝你成功!区域内进行代码补充。

Hakuuna的博客 655

A-Level CS 计算机科学 考试知识点——考试介绍&第1章

前言:该系列文章是本人在给学生辅导本课程的过程中结合英文教材所总结的,该系列共分为30章,主要介绍了考试的核心知识点。若需要A-Level CS 计算机科学考试辅导也可以私信我。 目录 关于A-Level CS 计算机科学考试 考试简介 考试内容 考试时间 评分情况 第1章 信息表示 本章学习内容 1.01 数字系统 1.02 数字的内部编码 整数编码(Coding for integers) 二进制编码的十进制(Binary coded decimal——BCD) 1.03.

王俊的博客 6456

CAN总线错误帧全解析:从数据包到硬件层的故障树分析

本文深入解析CAN总线错误帧的故障树分析方法,从数据包到硬件层全面剖析错误机制。通过物理层信号测试、数据链路层错误解码和应用层协议排查,提供系统化的诊断框架。结合CANoe配置和示波器波形分析,帮助工程师快速定位总线故障,提升系统可靠性。

weixin_26742753的博客 488

算法设计与分析 实验一 递归与分治策略

目录1.采用递归算法实现正整数10以内阶乘,并按照以下的顺序进行输出。2. 采用递归算法实现Ackerman函数,并且计算n, m小于等于3的输出结果。3. 采用递归算法实现Hanoi塔问题4. 二分搜索技术的递归实现与非递归实现5. 合并排序的递归实现6. 快速排序的递归实现 实验平台:Visual studio 6.0 或者VS2008及以上(我用的DEV-C++) 编程语言:C语言或者C++语言 1.采用递归算法实现正整数10以内阶乘,并按照以下的顺序进行输出。 算法输入:10以内的正整数 算法输出:

拔牙不打麻药 1363

别再瞎调了!手把手教你搞定STM32步进电机PID速度环(附完整代码与比例系数详解)

本文详细解析了STM32步进电机PID速度环的完整实现过程,从算法输出到脉冲频率的转换链路,重点讲解了比例系数的确定方法及系统标定实验。通过完整的代码示例和调试技巧,帮助工程师解决实际应用中的常见问题,提升步进电机控制精度与稳定性。

weixin_28729331的博客 214

递归与分策略之合并排序

归并排序问题 归并排序问题的思路是,首先把待排序的数组分成左右两组, 然后将左边一组和右边一组先分别排序 最后合并。 具体实现用了递归和分治的方法。 #include using namespace std; int a[100]; void merge(int left,int mid,int right) { int n1=mid-left+1; int n2

ices_的博客 583

人工势场法在自动驾驶避障中的实践与优化

本文深入探讨了人工势场法在自动驾驶避障中的核心原理与实践优化。通过解析引力与斥力模型,揭示了经典算法在局部最优和目标不可达等问题上的局限性,并重点介绍了改进斥力场函数、引入道路边界斥力及动态参数调整等关键优化策略,有效提升了该局部路径规划算法在复杂动态场景下的实用性与鲁棒性。

weixin_29208327的博客 926

MAIXCAM无线连接实战:5分钟搞定远程调试与代码烧录(避坑版)

本文提供了一份详细的MAIXCAM无线连接实战指南,帮助嵌入式视觉开发者快速配置远程调试与代码烧录。文章重点介绍了通过MaixHub IDE进行Wi-Fi配置、建立远程终端连接、使用SFTP进行文件传输以及管理自启动应用程序的完整流程,并针对IP地址变动、信号中断等常见问题提供了实用的避坑解决方案,旨在提升开发效率与灵活性。

weixin_29188043的博客 297

第二章 递归与分治策略算法实现(二分查找、合并排序、快速排序)

2.3 二分搜索技术 #include <stdio.h> int BinarySearch(int* a,int left,int right,int e)//寻找有序a[n]数组中是否有e元素,若有,返回e的位置;若没有,返回-1 { while (left <= right) { int mid = (left + right) / 2; if (a[mid] == e) { return mid; } else if (a[mid] < e) { Bin

paoxia333的博客 1378

Dell Precision 7920 Tower开机点不亮?别慌,看电源灯闪烁密码快速定位故障(附BIOS恢复指南)

本文详细解析了Dell Precision 7920 Tower工作站开机点不亮时的电源灯闪烁密码,帮助用户快速定位故障。从内存问题到BIOS恢复,再到CPU配置错误,提供了全面的诊断和修复指南,并附有实用的维护建议和工具推荐。

weixin_30892037的博客 482

【计算机算法设计与分析】归并排序(C++_分治递归)

问题描述 归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 笔者内心OS 今晚准备算法期末考试地时候,突然发现自己没有写过归并排序…好像从大一开始一直都知道这个概念以及排序过程,但是从来没有自己实践过,这个以后得注意! Code #include<bits/std

ccql's Blog 1166

【GEOS-Chem模拟教程第二期下】全球生物质燃烧 GFAS 数据配置

本博客详细介绍全球生物质燃烧 GFAS 数据下载及在 GEOS-CHEM 模型中的配置

WW、forever的博客 1394

【ArcGIS Pro微课1000例】0067:ArcGIS Pro3.4.2学习版下载及安装教程

【ArcGIS Pro微课1000例】0067:ArcGIS Pro3.4.2学习版网盘下载及安装教程

智慧空间实验室 2387

递归、回溯与分治

递归、回溯与分治举例说明 递归函数与回溯法 什么叫递归函数:编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。递归函数不能定义为内联函数。 举例说明: #include <stdio.h> void compute_sum(int i,int &sum){ if(i>3){//设置终止条件 return; } sum+=...

liuchang_lc的博客 1423

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

算法设计与分析(第五篇)(分治与递归)归并排序C++

#include&lt;iostream&gt; #include&lt;vector&gt; using namespace std; void Merge(vector&lt;int&gt;&amp; array, int l, int r, int mid, vector&lt;int&gt;&amp; result); void MergeSort(vector&lt;int&gt;&...

imiss的博客 603

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

算法设计与分析基础1 递归与分治

算法设计与分析基础1 递归与分治说明本系列总目录本部分目录1.递归与分治理解2.递归例子:汉诺塔3.递归例子:全排列4.递归例子:整数划分5.分治例子:二分搜索6.分治例子:归并排序7.分治例子:快速排序8.分治例子:线性时间选择 说明 留个纪念,记录部分大连理工大学算法设计与分析课程源代码。 给学弟学妹一些方便,或者是有基础算法需求的朋友。编程语言c++。 本系列总目录 注意:参考书:王晓东《算法设计与分析第四版》 递归与分治算法 动态规划 贪心算法 回溯算法 分支限界法 本部分目录 1.递归与分治理

weixin_46105942的博客 293

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

分治算法

分治算法一、算法设计与分析的基本概念一、算法二、算法设计三、算法的表示二、算法分析基础一、算法复杂度分析三、分治法一、递归的概念二、...

杨丙寅 165

分治算法-1

一、分治算法的原理 (1)设计过程: Divide:整个问题划分为多个子问题 Conquer:求解各子问题(递归调用子问题的算法) Combine:合并子问题的解,形成原始问题的解 (2)分析过程: (2.1)建立递归方程 T(n)=aT(n/b)+D(n)+C(n) Divide时间复杂度:D(n) Conquer时间复杂度:aT(n) Combine:C(n) 当n小于一个

程序员养成记 1130

【轻松掌握数据结构与算法】分治算法

分解:将问题分解为本身是同一类型问题的较小实例的子问题。递归:递归地解决这些子问题。合并:适当地组合它们的答案。分治法是一种通过递归地将问题分解成较小的子问题,解决这些子问题,然后合并它们的解来解决原问题的算法策略。

Whoisbug的博客 1154

Leetcode学习之递归、回溯与分治(2)

开宗明义:本系列基于小象学院林沐老师课程《面试算法 LeetCode 刷题班》,刷题小白,旨在理解和交流,重在记录,望各位大牛指点! Leetcode学习之递归、回溯与分治(2) 文章目录1、生成括号(递归设计)Leetcode 22.2、N皇后(回溯法)3、逆序数(分治法、归并排序应用)4、 1、生成括号(递归设计)Leetcode 22. 题目来源:Leetcode 22.&n...

qq_33948796的博客 414

分治的算法设计思想

分治(Divide and Conquer)是递归程序设计当中,一种非常重要的算法设计思路。利用它我们可以设计出许多高效的算法,例如排序、查找、大数乘积、矩阵乘法以及语法分析等等。它的核心思想是将一个复杂的问题分解成类型相同且相互独立的小问题,然后将小问题的解汇总,最终解决大问题。       分治法的一般步骤       使用分治法进行算法设计的一般步骤如下:       1. 将问题分为

为之,则难者亦易矣;不为,则易者亦难矣。 4785

分治算法的时间复杂度分析

分析算法的时间复杂度是必要的,因为这可以帮助我们了解算法的效率,从而在设计和实现算法时做出更好的决策。

qq_74727181的博客 2089

第二章 算法基础 2.3 设计算法

2.3 设计算法 一. 分治法

weixin_43172803的博客 374
上一篇: 算法设计与分析——递归与分治策略——棋盘覆盖
下一篇: 算法设计与分析——递归与分治策略——快速排序
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值