看图轻松理解数据结构与算法系列(合并排序)

前言

推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各种堆、各种队列、各种列表、各种树、各种图、各种排序等等几十篇的样子。

合并排序

合并排序也叫归并排序,它的主要思想是分治法,把待排序序列分为若干有序子序列,然后将两个或两个以上的有序子序列进行合并,得到一个新的完整的有序序列。所以首先得先对子序列进行排序,得到有序子序列,然后再使序列段之间有序。

排序要点

既然是分治法,那么就涉及到分和治。分,即递归地将序列分成小序列再求解;治,即递归地将分成的小序列合并到一起。

  1. 设序列长度为L,将序列分为两个长度为(L/2)的子序列。
  2. 继续递归地对两个子序列分割,直至不能再继续分割,此时每个子序列只有一个元素。
  3. 对分割后的子序列进行递归地合并,按一定顺序组合成有序子序列,有序子序列之间继续合并。
  4. 最终合并成一个完整的长度为L的有序序列。

排序过程

假设我们有如下8个元素,分别为84,25,59,71,62,16,34,45,现在进行合并排序。

《看图轻松理解数据结构与算法系列(合并排序)》

先将0到3分为子序列,4到7分为子序列,

《看图轻松理解数据结构与算法系列(合并排序)》

对于0到3子序列,继续分为0到1的子序列,2到3的子序列,

《看图轻松理解数据结构与算法系列(合并排序)》

对于0到1子序列,继续分为0子序列和1子序列,然后对这两个子序列进行合并,两个子序列都只有一个元素,一个元素的序列可以看成是有序序列,我们把它们合并成有序序列,25小,先提出来,

《看图轻松理解数据结构与算法系列(合并排序)》

然后是84,

《看图轻松理解数据结构与算法系列(合并排序)》

排好序的序列放回原来序列中,于是完成0和1子序列的合并操作,01变成有序子序列。接着处理2子序列和3子序列,

《看图轻松理解数据结构与算法系列(合并排序)》

59比较小,先提出来,

《看图轻松理解数据结构与算法系列(合并排序)》

然后是71,

《看图轻松理解数据结构与算法系列(合并排序)》

排好序的序列放回原来序列中,于是完成2和3子序列的合并操作,23变成有序子序列。

《看图轻松理解数据结构与算法系列(合并排序)》

接下去开始合并01有序子序列和23有序子序列,01序列中最小的元素25小于23序列中最小的元素59,于是25先提出来,

《看图轻松理解数据结构与算法系列(合并排序)》

01序列剩余元素中最小元素84大于23序列中最小的元素59,于是59提出来,

《看图轻松理解数据结构与算法系列(合并排序)》

84与71比较,提出71,

《看图轻松理解数据结构与算法系列(合并排序)》

最后提出84,

《看图轻松理解数据结构与算法系列(合并排序)》

于是完成0到3的合并,0到3变为有序序列,放回原序列中。接下去处理4到7的子序列,

《看图轻松理解数据结构与算法系列(合并排序)》

继续分为4到5的子序列,6到7的子序列,

《看图轻松理解数据结构与算法系列(合并排序)》

对于45子序列,继续分为4子序列和5子序列,然后对这两个子序列进行合并,两个子序列都只有一个元素,一个元素的序列可以看成是有序序列,我们把它们合并成有序序列,16小,先提出来,

《看图轻松理解数据结构与算法系列(合并排序)》

然后是62,

《看图轻松理解数据结构与算法系列(合并排序)》

排好序的序列放回原来序列中,于是完成4和5子序列的合并操作,45变成有序子序列。接着处理6子序列和7子序列,

《看图轻松理解数据结构与算法系列(合并排序)》

34较小,先提出来,

《看图轻松理解数据结构与算法系列(合并排序)》

然后是45,

《看图轻松理解数据结构与算法系列(合并排序)》

排好序的序列放回原来序列中,于是完成6和7子序列的合并操作,67变成有序子序列。

《看图轻松理解数据结构与算法系列(合并排序)》

接下去开始合并45有序子序列和67有序子序列,45序列中最小的元素16小于67序列中最小的元素34,于是16先提出来,

《看图轻松理解数据结构与算法系列(合并排序)》

45序列中剩余元素中最小元素62大于67序列中最小的元素34,于是34提出来,

《看图轻松理解数据结构与算法系列(合并排序)》

62与45比较,提出45,

《看图轻松理解数据结构与算法系列(合并排序)》

最后提出62,

《看图轻松理解数据结构与算法系列(合并排序)》

于是完成4到7的合并,4到7变为有序序列,放回原序列中。现在我们已经完成了0到3的有序序列和4到7的有序序列,接下去开始合并03序列和47序列,

《看图轻松理解数据结构与算法系列(合并排序)》

03序列最小元素25与47序列最小元素16比较,选出小的16,

《看图轻松理解数据结构与算法系列(合并排序)》

继续比较两个序列最小的元素,25与34比较,选出25,

《看图轻松理解数据结构与算法系列(合并排序)》

接着59与34比较,选出34,

《看图轻松理解数据结构与算法系列(合并排序)》

59与45比较,选出45,

《看图轻松理解数据结构与算法系列(合并排序)》

59与62比较,选出59,

《看图轻松理解数据结构与算法系列(合并排序)》

71与62比较,选出62,

《看图轻松理解数据结构与算法系列(合并排序)》

然后剩下的71和84不用比较了,因为47序列已经没有元素了,直接按照原来顺序提出来即可,

《看图轻松理解数据结构与算法系列(合并排序)》

最终完成排序。

《看图轻松理解数据结构与算法系列(合并排序)》

————-推荐阅读————

我的开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)

为什么写《Tomcat内核设计剖析》

我的2017文章汇总——机器学习篇

我的2017文章汇总——Java及中间件

我的2017文章汇总——深度学习篇

我的2017文章汇总——JDK源码篇

我的2017文章汇总——自然语言处理篇

我的2017文章汇总——Java并发篇

跟我交流,向我提问:

《看图轻松理解数据结构与算法系列(合并排序)》

欢迎关注:

《看图轻松理解数据结构与算法系列(合并排序)》

    原文作者:算法小白
    原文地址: https://juejin.im/post/5bc3e0f06fb9a05d3a4b5e2c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞