递归法解决归并排序问题

一、归并排序思想

将数组分解成两个较小的数组,直到子数组的大小为一
递归对子数组进行排序合并,直到合并成完整的数组

二、归并排序图示

在这里插入图片描述

三、分解方式和合并方式

分解

将数组等分
在这里插入图片描述

合并

在这里插入图片描述
如上图,如此循环下去就能将两个小数组排好序,合并成大数组

归并排序代码及解释

merge_sort函数完成分解递归工作
在这里插入图片描述
merge函数完成排序合并工作
在这里插入图片描述

链接: [代码具体运行——小蜘蛛](链接: link)

代码

def merge_sort(arr):
    #如果数组中只有一个元素,返回这个列表
    if len(arr)<=1:
        return arr
    #分解:将数组分成左右两部分
    mid=len(arr)//2
    left_half=arr[:mid]
    right_half=arr[mid:]
    #递归拆解左右两个序列
    left_half=merge_sort(arr[:mid])
    right_half=merge_sort(arr[mid:])
    #将拆解好的两个最小子序列排序合并(第一次调用该函数时数组中只有一个元素)
    return merge(left_half,right_half)

def merge (left,right):
    merged=[]
    left_point=0
    right_point=0
    #左右比较,较小的放在新列表中
    while left_point<len(left) and right_point<len(right):
        if left[left_point]<right[right_point]:
            merged.append(left[left_point])
            left_point+=1
        else:
            merged.append(right[right_point])
            right_point+=1
    #如果左右数组中还有别的元素,直接将其他所有元素补充到新数组即可
    merged.extend(left[left_point:])
    merged.extend(right[right_point:])
    #这一步 将排好序的较大数组再一次返回到 merge_sort函数的递归语句中
    #比如返回[14,20] , 递归语句会把[30][35]传给 merge 函数,进行排序、合并
    return merged
    
arr1=[20,14,30,35,7,22,18,40]
print(merge_sort(arr1))

时间复杂度、空间复杂度、最坏情况、最好情况

时间复杂度:T=O(nlogn)
时间函数:T(n)=2T(n/2)+cn

空间复杂度((用数组存储数据):S=O(n)
由于归并排序需要申请额外的空间,即创建一个新数组来存放排好序的数组,因此空间复杂度就是该数组的大小n
用链表存储数据空间复杂度为:S=O(1)

最坏情况和最好情况均相同、因为数据都是被一分为二的、不存在像快速排序分割方式不当的情况

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值