归并排序,以及里面蕴含的递归思想

11 篇文章 2 订阅
9 篇文章 0 订阅

归并排序,以及里面蕴含的递归思想

归并排序原理,就是将一个乱序的数组,划分成两个无序的数组,然后,分别将这两个数组排好序,在通过外排的方式,将数组排好,将辅助列表赋值给原列表。

现在,原理我们搞清楚了,那如何利用编程实现呢?

我们先来看,如果在计算机中,这个归并是怎么实现的。我们假设有一个长度为8的乱序数组:[1,3,56,8,9,45,85,74]

1
3
5
8
9
45
74
85
1,3,56,8,9,45,85,74
1,3,56,8
1,3
56,8
9,45,85,74
9,45
85,74

如这个图表所示,这个就是计算机利用递归实现,我们可以看到,它不停地将数组进行拆分和合并。拆分到不能拆分后将最先不能拆的两个排好,然后依次网上还原,最终将整个数组排好。

我们来看递归的定义:

递归,通俗的来讲,就是系统帮我们压栈,系统会将程序进行的过程不断的记录下来,然后呢,知道函数触碰到了递归基线,也就是循环停止条件,系统就会拿着这个条件开始不断地还原之前储存的过程。这个就是递归的整个流程。

归并也是一样,利用递归,不断地拆分数组,然后排序还原,最后变成一个有序的数组。

代码参考网站:https://blog.csdn.net/su_bao/article/details/81053871

现在,我们利用python将它实现:

def merge(a, b):
    c = []
    h = j = 0
    while j < len(a) and h < len(b):# 越界判断
        # 按次序填入外排数组
        if a[j] < b[h]:
            c.append(a[j])
            j += 1
        else:
            c.append(b[h])
            h += 1
# 极端情况,当有一组里面第一个数比所有的都大的时候
    if j == len(a):
        for i in b[h:]:
            c.append(i)
    else:
        for i in a[j:]:
            c.append(i)

    return c


def merge_sort(lists):
    if len(lists) <= 1:
        return lists# 相当于递归中的结束,可以没有意义,但这个lists就是用来分割
    middle = len(lists)//2
    left = merge_sort(lists[:middle])# 这个就相当于是left = lists = c
    right = merge_sort(lists[middle:]) # right = lists = c
    return merge(left, right)


if __name__ == '__main__':
    a = [14, 2, 34, 43, 21, 19]
    print (merge_sort(a))# 最终打印的是c的值。

现在,我们来看看,这个代码是怎么实现排序这六个数的。

通过第一个递归,也就是left,我们将数组变成了 [数组1] [数组1拆分1次] [数组1拆分两次] 以及[数组2] [数组2拆分1次] [数组2拆分两次]

数组二第二次拆分,分成了14,和2,34这个情况。2,34先达到栈顶,然后还原加上排序,将值赋值给了right,同时14也赋值给了left。又merge了一遍,接下来这个值给了数组1,于是左边就递归完了。那么右边也是一样的。这个有点像二叉树的遍历。

最后,整个数组递归完毕。这个就是归并排序。

递归的看法

这里我觉得,我么可以模拟系统压栈的思想,将程序分离,从上往下画图,然后从基线条件开始往下往上推导,这样能够更好地读懂递归。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值