分治算法
写在前面的话
本文是本学渣因为考试需要写的一篇总结,只总结了需要考察的考点,所以可能有的内容引申的不多,请见谅。
一、思想:分而治之
分(Divide): 递归解决较小的问题,直到终止层或者可以解决的时候停下来
治(Conquer): 递归求解,如果问题够小直接求解
合并(Combine): 用子问题的解合并构建父问题
二、归并排序:
# 归一化
def merge_sort(nums, begin, end):
if begin < end:
mid = (begin + end) // 2
merge_sort(nums, begin, mid)
merge_sort(nums, mid + 1, end)
merge(nums, begin, mid, end)
# 合并化
def merge(nums, begin, mid, end):
left_cur, right_cur = begin, mid + 1
merged_nums = []
while left_cur <= mid and right_cur <= end:
if nums[left_cur] < nums[right_cur]:
merged_nums.append(nums[left_cur])
left_cur += 1
else:
merged_nums.append(nums[right_cur])
right_cur += 1
if left_cur <= mid:
merged_nums.extend(nums[left_cur:mid + 1])
else:
merged_nums.extend(nums[right_cur:end + 1])
nums[begin:end + 1] = merged_nums