第二章
算法基础
2.3.1 分治法
许多有用的算法在结构上是递归的,为了解决某个问题,算法依次或多次递归的
调用其自身已解决其紧密相关的若干子问题。这些算法典型遵循分治法的思想。
分治模式每层递归都有三个步骤:
分解 将原问题分解为若干子问题,这些子问题都是原问题较小的
实例。
实例:对
于给定输入序列成为问题的实例。
解决 递归的求解各子问题,如果子问题够小则可以直接求解。
合并 将子问题的解合并成原文题的解。
归并排序完全遵循分治模式。
分解 待排序的n个元素的序列成各具n/2个元素的两个子序列。
解决 递归的求解各个子问题,若子问题足够小,则直接求解
合并 合并两个已排序的子序列产生答案
原书伪代码(含哨兵 用于判断子序列元素是否用完)
排序部分
MERGE(A,p,q,r) //A待排数组,p起始项,q中间项,r末尾项
n1 = q - p + 1
n2 = r - q
//创建两个子序列L[1..n1+1],M[1..n2+1]
for i = 1 to n1
L[i] = A[q+j]
for j = 1 to n2
R[j] = A[q + j]
L[n1 + 1] = ∞ //哨兵
R[n2 + 1] = ∞
i = 1
j =