内部排序(四)归并排序的递归与循环实现

本文详细介绍了归并排序的递归和循环实现方法,包括归并操作的过程、时间复杂度分析以及如何将序列一分为二进行排序。通过递归和循环两种方式的比较,阐述了归并排序的分而治之思想,并提供了相应的代码示例。
摘要由CSDN通过智能技术生成

上一篇日志讲到了自己对堆排序的学习,堆排序时间复杂度能达到O(NlogN),且不需要额外的空间来存储排序过程中的有序序列,优点明显,不过堆排序不是稳定的,也就是说排序后相等数据之间的相对位置可能会发生改变。上一周的学习学到了一个同样时间复杂度为O(NlogN)的且是稳定的排序方法!那就是归并排序。

归并操作其实更多用在外部排序中- -、,是外部存储器最常用的排序方法,用分而治之的思想,下面会说。归并排序的核心是归并操作,归并操作是把有序子列做归并。下面看看归并操作的过程:

借用一道例题,上面我们看到两个已经按升序排好的序列,然后我们要把这两个序列归并成一个序列,归并后的序列仍是按升序排列。很简单我们可以想到用两个指针指示两个有序序列中元素的位置,从头开始每次比较两个指针指向的元素,较小的元素就先复制到那个额外空间里去,然后指针指向的元素往后挪一位,直到最后某一个有序序列的所有元素都复制到额外空间里去后,把另外一个序列的所有元素都跟着全放进去就可以了(因为序列本来有序嘛,直接往里仍)。

比较16比25小,就把16放下来,指针往后挪一位。

25比38小,就25挪下来。

一直做下去,直到某一个子序列元素为空,就把剩下的序列中所有元素放下来。

上面就是归并操作的过程,是归并操作不是归并排序哦!!就归并操作而言,时间复杂度是O(N),也就是说两个子序列中总共N个元素都被扫描了一遍。

那么归并操作的代码要怎么写?思路就是先开一个大小为两个子序列大小之和的额外空间,然后用两个指针分别指向两个序列的首元结点࿰

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值