经典排序三剑客: 归并,堆排,快排。

      今天,图解归并,一步步带你手撕代码~

      归并排序,是采用"分而治之"思想的一个典型应用。

      分治法精髓:

      1. --- 将问题分解成若干个规模更小的问题

      2. --- 将这些规模更小的问题逐个击破

      3. --- 将已解决的子问题合并,最终得到"母"问题的解

      知道了归并思想,如图,归并排序流程我们也能想到:

      1.将待排序数组分解两个子序列,先让让左右两个子序列有序,然后再用两个有序数组合并的算法合并。那么怎么让左右子序列有序呢?

      

      2.我们发现左右子序列还可以继续分解,左右子序列也可以通过自身的左右子序列排序后归并得到

      3.继续分解,分解到最小规模,也就是每个部分只有一个元素,我们发现每部分已经有序了

      4.分治完,如图,开始用两个有序数组合并的算法合并,我们会发现这是一个递归过程,子问题的合并解就是该子问题"母问题"的解

 

  

      归并流程我们可以用递归实现,接下来要图解合并两个有序数组的算法 :

        

        C代码实现:

#include<stdlib.h>
#include<stdio.h> //归并两个有序数组
void Merge(int* a, int left, int mid, int right,int* tmp)
{ int begin1 = left, end1 = mid;
int begin2 = mid+, end2 = right;
int index = left; //比较排序(双指针)
while (begin1<=end1 && begin2<=right)
{
if (a[begin1] <= a[begin2])
{
tmp[index++] = a[begin1++];
}
else
{
tmp[index++] = a[begin2++];
}
}
//若剩余数组,按序插入
while (begin1 <= end1)
tmp[index++] = a[begin1++]; while (begin2 <= end2)
tmp[index++] = a[begin2++];
//拷贝到原数组
index = left;
while (left <= right)
{
a[left++] = tmp[index++];
}
} //分解成最小子问题,回溯归并
void Sort(int *a, int left, int right,int* tmp)
{
//递归终止条件 : 只剩一个元素
if (left >= right)
return; int mid = left + (right-left)/;
Sort(a, left, mid,tmp);
Sort(a, mid+, right,tmp);
Merge(a, left, mid, right,tmp);
} //归并排序
void MergeSort(int *a, int n)
{
int* tmp = (int *)malloc(sizeof(int)*n);
Sort(a, , n - , tmp);
free(tmp);
}

 时间复杂度:O(nlogn)

    空间复杂度:O(N),归并排序需要一个与原数组相同长度的数组做辅助来排序

稳定性: 稳定, 不管顺序如何,都要分解成最小子问题进行归并。

     

DS 图解归并排序的更多相关文章

  1. DS 图解快排

    快速排序是交换排序,是冒泡排序的改进版. 快排过程: 1.选定一个分界值     2.分成三个部分(小于分界部分,分界值,大于分界值部分)                       3.对于分开的两 ...

  2. DS 图解堆排

    堆排其实就是选择排序,只不过用了完全二叉树特性. 堆排思想 : 利用完全二叉树特性建堆和重复选择调整来得到有序数组. 完全二叉树有什么特性呢? 节点左对齐 ---> 层序遍历不会出现空,可以用数 ...

  3. java泛型中使用的排序算法——归并排序及分析

    一.引言 我们知道,java中泛型排序使用归并排序或TimSort.归并排序以O(NlogN)最坏时间运行,下面我们分析归并排序过程及分析证明时间复杂度:也会简述为什么java选择归并排序作为泛型的排 ...

  4. 【高级排序算法】1、归并排序法 - Merge Sort

    归并排序法 - Merge Sort 文章目录 归并排序法 - Merge Sort nlogn 比 n^2 快多少? 归并排序设计思想 时间.空间复杂度 归并排序图解 归并排序描述 归并排序小结 参 ...

  5. java知识树

    https://blog.csdn.net/aitaozi11/article/details/79652943 (学习Java的9张思维导图) 文章目录 针对技术栈学习 1. java基础 1.1 ...

  6. 10大排序算法——Java实现

    算法与实现 选择排序 算法思想 从数组中选择最小元素,将它与数组的第一个元素交换位置.再从数组剩下的元素中选择出最小的元素,将它与数组的第二个元素交换位置.不断进行这样的操作,直到将整个数组排序. 动 ...

  7. [图解算法] 归并排序MergeSort——<递归与分治策略>

    #include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...

  8. 【DS】排序算法之归并排序(Merge Sort)

    一.算法思想 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用,指的是将两个已经排序的序列合并成一个序列的操作.其归并思想如下: 1)申请空间,使其大小为两个已经 ...

  9. java归并排序,单线程vs多线程

    一.什么是归并排序 归并排序又称合并排序,它是成功应用分治技术的一个完美例子.对于一个需要排序的数组A[0..n-1],归并排序把它一分为二:A[0..n/2-1]和A[n/2..n-1],并对每个子 ...

随机推荐

  1. 使用git_stats 统计分析git 仓库代码&& 集成webhook

      前几天写过一个使用gitstats 统计分析代码的,但是那个因为开发的问题,对于直接和容器集成是有问题的,统计需要进入容器执行 命令,对于自动构建的还不是很方便,所以使用了git_stats 项目 ...

  2. 2019 SDN第3次上机作业

    0.报文类型与含义 1.Controller-to-Switch 报文 ​ Cortoller-to-Switch是由控制器初始化并下发给交换机的报文类型,其可能会要求交换机回复对应的报文,此类型报文 ...

  3. 地址栏从url输入到页面显示

    本文链接:https://blog.csdn.net/MiemieWan/article/details/85708052地址栏输入url, 要通过dns解析(浏览器是不能识别url地址的,需解析成i ...

  4. 刷题记录:Shrine

    目录 刷题记录:Shrine 刷题记录:Shrine 题目复现链接:https://buuoj.cn/challenges 参考链接:Shrine 解此题总结一下flask的SSTI:CTF SSTI ...

  5. merge同时包含增、改、删

    我们都知道oracle merge可以用来增和改,很少用它来删除.但是有时候我们仍然需要该特性,以提高性能,典型的场景就是将业务库逻辑删除的记录同步到查询库的时候,做真正的物理删除,这个时候merge ...

  6. RFC2119 规范内容

    RFC2119 https://www.ietf.org/rfc/rfc2119.txt Network Working Group S. Bradner Request for Comments: ...

  7. Python3基础 函数 函数名赋值操作

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  8. pytorch保证每次运行使用的随机数都相同的方法

    其实在代码的开头添加下面几句话即可: # 保证训练时获取的随机数都是一样的 init_seed = torch.manual_seed(init_seed) torch.cuda.manual_see ...

  9. asp.net core mvc 读取appsettings.config中文乱码问题

    asp.net core mvc 读取appsettings.config中文乱码问题的解决方法如下: 用记事本打开appsettings.config,另存为的时候,编码设置为 “UTF-8”,

  10. react项目中element的DatePicker回显

    element的DatePicker获取value的时候是日期对象如下,可以提交的时候查看参数 2019-06-30T17:02:02.000Z  如果是console.log打印出来的话,是这样的 ...