用分治法解决归并排序问题

用分治法解决归并排序问题

算法流程:

1.分解原问题:将数组A[1,n]排序问题分解为A[1,n/2]排序问题和A[n/2+1,n]排序问题
2.解决子问题:递归解决子问题得到两个有序子数组
3.合并问题解:合并两个有序子数组为一个数组
算法代码:

import copy
def Merge(A,left,mid,right):
# 创建一个元组A_,用来承接计算过程中元组A的元素,要用深复制
# 深复制使得A和A_两个元组在计算过程中毫无关联,不会互相影响
	A_=copy.deepcopy(A)		
	i=left
	j=mid+1
	k=0		# 表示计算运行到数组元素的第几个
	while i<=mid and j<=right:
		if A_[i]<=A_[j]:
			A[left+k]=A_[i]
			k+=1
			i+=1
		else:
			A[left+k]=A_[j]
			k+=1
			j+=1
	if i<=mid:		# 利用元组切片来进行赋值
		A[left+k:right+1]=A_[i:mid+1]
	else:
		A[left+k:right+1]=A_[j:right+1]

def MergeSort(A,left,right):
	if left>=right:
		return A[left]		# 递归出口
	mid=(left+right)//2	mid要向下取整
	MergeSort(A,left,mid)	# 对A[left,mid]排序
	MergeSort(A,mid+1,right)	# 对A[mid+1,right]进行排序
	Merge(A,left,mid,right)	合并两个子元组
	return A[left:right+1]	# 返回排好序的元组A

想要详细了解如何用分治法解决归并排序问题的可以看北航童咏昕老师的算法与分析2.1归并排序视频。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值