继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

归并排序精讲——分治算法的初步应用

慕神8447489
关注TA
已关注
手记 1259
粉丝 174
获赞 956

归并排序,是一种使用分治策略的算法,主要分为两种,一种是自顶向下,一种是自底向上。这两种排序一般都是使用递归方法实现。对于初级程序员来说,虽然递归这个过程理解起来有些难度,但只要过程能够梳理清楚,一般情况下归并排序还是很容易理解的。

归并排序是一种O(nlogn)级别的归并排序,效率比不上快速排序,但对于一般用于对总体无序,但是各子项相对有序的序列,还是有一定用途的。

自顶向下

对于自顶向下的归并排序,主要过程是先将一个待排序的序列进行等半划分,然后再使用递归策略,对刚刚划分出的待排序的子序列进行等半划分,直到划分到底(每个子序列只有一个元素),这就是分的过程。详细图示如下:

webp

归并排序-自顶向下-分

然后,在从底部开始,向上对两个子序列进行归并,得到一个有序的子序列,直到归并到顶,这就是治的过程。详细图示如下:

webp

归并排序-自顶向下-治

治的过程中,每两个待归并的数组,需要将每个元素进行比较,合并成一个有序的数组,这个归并过程如下图所示:

webp

归并排序-归并过程

在归并的过程中,有一个重要的操作需要你注意,就是要重新申请一段空间,用于存放已经排好序的数组。这样就导致归并排序的空间复杂度不是太好。但现在计算机的内存空间可以说是非常廉价,所以当前这已经不算是一个太大的劣势。

自底向上

对于自底向上的归并排序,基本思路和自顶向下是没有什么区别的,最大的区别就是:分和治是同步进行的,每分一步,就把分出来的序列治理好。而且分的过程就是从最小的单元开始分,直到分治出整个待排序的序列。整个排序的示意图如下:

webp

归并排序--自底向上

总结

以上就是两种归并排序的详细过程,还有一个重点需要说明的情况就是:归并排序是一种稳定排序,不管待排序序列是几乎有序的数组,还是有很多重复的元素,对归并排序的时间复杂度几乎都没有什么影响。而之前我们讲的快速排序,则完全是另一种情况,感兴趣的读者可以看看我之前写的文章。



作者:航哥很帅
链接:https://www.jianshu.com/p/636642121c97


打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP