DS 图解归并排序
经典排序三剑客: 归并,堆排,快排。
今天,图解归并,一步步带你手撕代码~
归并排序,是采用"分而治之"思想的一个典型应用。
分治法精髓:
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 图解归并排序的更多相关文章
- DS 图解快排
快速排序是交换排序,是冒泡排序的改进版. 快排过程: 1.选定一个分界值 2.分成三个部分(小于分界部分,分界值,大于分界值部分) 3.对于分开的两 ...
- DS 图解堆排
堆排其实就是选择排序,只不过用了完全二叉树特性. 堆排思想 : 利用完全二叉树特性建堆和重复选择调整来得到有序数组. 完全二叉树有什么特性呢? 节点左对齐 ---> 层序遍历不会出现空,可以用数 ...
- java泛型中使用的排序算法——归并排序及分析
一.引言 我们知道,java中泛型排序使用归并排序或TimSort.归并排序以O(NlogN)最坏时间运行,下面我们分析归并排序过程及分析证明时间复杂度:也会简述为什么java选择归并排序作为泛型的排 ...
- 【高级排序算法】1、归并排序法 - Merge Sort
归并排序法 - Merge Sort 文章目录 归并排序法 - Merge Sort nlogn 比 n^2 快多少? 归并排序设计思想 时间.空间复杂度 归并排序图解 归并排序描述 归并排序小结 参 ...
- java知识树
https://blog.csdn.net/aitaozi11/article/details/79652943 (学习Java的9张思维导图) 文章目录 针对技术栈学习 1. java基础 1.1 ...
- 10大排序算法——Java实现
算法与实现 选择排序 算法思想 从数组中选择最小元素,将它与数组的第一个元素交换位置.再从数组剩下的元素中选择出最小的元素,将它与数组的第二个元素交换位置.不断进行这样的操作,直到将整个数组排序. 动 ...
- [图解算法] 归并排序MergeSort——<递归与分治策略>
#include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...
- 【DS】排序算法之归并排序(Merge Sort)
一.算法思想 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用,指的是将两个已经排序的序列合并成一个序列的操作.其归并思想如下: 1)申请空间,使其大小为两个已经 ...
- java归并排序,单线程vs多线程
一.什么是归并排序 归并排序又称合并排序,它是成功应用分治技术的一个完美例子.对于一个需要排序的数组A[0..n-1],归并排序把它一分为二:A[0..n/2-1]和A[n/2..n-1],并对每个子 ...
随机推荐
- Alpha冲刺(4/6)
队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 摸鱼 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的进度 学习如何评估代码质量 准备Al ...
- 怎么样使element ui 的table某列变色
第一步.在el-table里面加上:row-style="rowClass" <el-table :data="targetCarList" border ...
- 基于Hadoop爬虫网易云歌曲评论
作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 本次选取的是爬取歌曲<大碗宽面>的歌评数据 1.将 ...
- Nginx搭建简单文件下载服务器
在C:\pleiades\nginx-1.16.1下新建一个目录files,然后放入若干文件,接下来修改nginx.conf,增加粗体字如下: #user nobody; worker_process ...
- ThinkPHP5 基础知识入门 [入门必先了解]
一.目录结构 下载最新版框架后,解压缩到web目录下面,可以看到初始的目录结构如下: project 应用部署目录 ├─application 应用目录(可设置) │ ├─common 公共模块目录( ...
- MySQL count
https://www.jianshu.com/p/1b0a1f641e80] 不同引擎count(*)实现方式不同 MyISAM引擎把一个表的总行数记录在了磁盘上,执行count(*)会直接返回这个 ...
- Python3基础 list(dict) 使用 * 扩充时,出现字典元素重复问题
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- 泡泡一分钟:Efficient Trajectory Planning for High Speed Flight in Unknown Environments
张宁 Efficient Trajectory Planning for High Speed Flight in Unknown Environments 高效飞行在未知环境中的有效轨迹规划链接: ...
- SDN实验---Mininet的相关命令(待补充完善)
一:补充 (一)推文 openvswitch的原理和常用命令 https://blog.csdn.net/ten_sory/article/details/79593554 (二)回顾:sudo mn ...
- LLBLGen update table with join
Table1 id Name 1 xxx 2 ooo Table2 Table1Id Table1Name Column1 Column2 Column3 1 sss xxxx xxxx xxxx 2 ...