为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
算法

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

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

自顶向下

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

webp

归并排序-自顶向下-分

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

webp

归并排序-自顶向下-治

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

webp

归并排序-归并过程

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

自底向上

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

webp

归并排序--自底向上

总结

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



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


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消