1.方法
将数组从中间分成两部分,对前后两部分分别进行排序(继续拆分,直到每部分只有一个数字),将排好序的两部分进行合并,这样整个数组就是有序的了。
2.示例
3.分析
归并排序使用了分治的思想,把大问题分解成小问题再逐个解决,小问题解决后,大问题也就解决了。对于利用分治思想的问题一般可以用递归来实现。
递推公式:merge_sort(p,q) = merge(merge_sort(p,r) ,merge_sort(r,q))
终止条件:p>=q
这里的合并是对两个已经有序的数组进行合并,合并后仍然保持有序,我们可以使用一个大小等于分解前原数组的数组tmp,并使用双指针,分别指向两个数组的第一个元素,然后进行比较,将小的值添加到tmp,指针后移。直到其中一个数组遍历结束,将另一个数组的剩余元素直接添加到tmp。
4.代码
def merge(L,R):
# 两个指针
i, j = 0,0
# 用于存放合并结果
res = []
# 比较,直到一个数组被全部添加
while i < len(L) and j < len(R):
if L[i] <= R[j]:
res.append(L[i])
i += 1
else:
res.append(R[j])
j += 1
# 对未处理完的列表,直接加入res中
res += R[j:] if i == len(L) else L[i:]
return res
def merge_sort(nums):
n = len(nums)
if n <= 1:
return nums
else:
mid = n//2
left = merge_sort(nums[:mid])
right = merge_sort(nums[mid:])
return merge(left,right)
if __name__ == '__main__':
nums = [13,9,7,6,3,5,8,11,2,4,1,12,20,16,14]
print(merge_sort(nums))