2022.03.12

课时49 归并排序

首先将整个序列进行拆分。

第一次分成两个部分后,再将左边部分拆分成两个部分。

然后就这么拆分到每一个部分只有一个元素。

拆分后,相邻两个元素开始合并。

合并时,小的元素要放在前面。

比如,【54】和【26】合并后,就是【26,54】。

 

接着,又每两个元素为一组开始合并。

此时需要借助两个游标,一个是右边的,一个是左边的。

左边游标指向的小,先把左边游标的拿出来,然后继续走。

此时移动后,左边游标的比右边游标的大的话,则把右边游标的拿出来。

如此重复。

最后就能得到一个有序序列。

这就是归并序列。

def merge_sort(alist):
    """归并排序"""
    n=len(alist)
    if n<=1:
        return alist
    mid=n//2
    #left和right为采用归并排序后形成的有序的新的列表
    left=merge_sort(alist[:mid])
    right=merge_sort(alist[mid:])

    #将两个有序的序列left和right合并为一个新的整体
    #merge(left,right)
    left_pointer,right_pointer=0,0
    result=[]
    while left_pointer<len(left) and right_pointer<len(right):
        if left[left_pointer]<right[right_pointer]:
            result.append(left[left_pointer])
            left_pointer+=1
        else:
            result.append(right[right_pointer])
            right_pointer+=1
    #退出循环时,代表某一个指针走到头了。
    #所以,此时要把另一个游标没走完的部分加入进来
    result+=left[left_pointer:]
    result+=right[right_pointer:]
    return result

if __name__=="__main__":
    li=[54,26,27,88,19,9,89,13]
    sorted_li=merge_sort(li) #因为函数是返回一个值,所以需要一个来接收这个值。
    print(li)
    print(sorted_li)

执行结果:
[54, 26, 27, 88, 19, 9, 89, 13]
[9, 13, 19, 26, 27, 54, 88, 89]

 课时50 归并序列_代码执行流程。

以这个列表为例。

首先一进入取了长度,判断其不等于1,则开始取中间值,然后分成两个部分。

等于形成了两个新列表,此时又会对这两个新列表进行拆分。

 

列用递归不停调用自己,直到长度小于或等于1,此时返回自身。

由于不会再调用,所以left此时保持着上一次递归取得的值。

right也是如此。

 

此时进入循环。

在循环内,去执行循环语句。也就是合并。

并且一定要返回,返回之后就是上面一个的返回集。

 

在上面拿到返回值后,才能去执行右边的的函数。

即才能执行上面这个函数。

接着合并。

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值