用分治法解决归并排序问题
算法流程:
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归并排序视频。