最大子数组问题(分治法)
时间算法度: Θ ( n l g n ) Θ\left(nlgn\right) Θ(nlgn)
该算法主旨:
归并排序算法完全遵照分治模式得三个步骤:
- 分解:分解 n n n个元素的序列,使其成为各具 n / 2 n/2 n/2个元素的两个子序列。
- 解决:使用 “寻找最大子序列函数” 递归地寻找两个子序列中最大得子序列。
- 合并:比较两个已寻找到的子序列以产生最大得子序列。
当待排序的序列长度为 1 1 1时,递归"开始回升",因为长度为 1 1 1的序列都已排好序(或者说时不需要排序)
伪代码:
/* ——————————————————————————————————————————————————————
* 寻找最大子数组函数
* —————————————————————————————————————————————————————— */
FIND_MAX_CROSSING_SUBARRAY(A, low, mid, high)
1 left_sum = 0
2 sum = 0
3 max-left = 0
4 for i = mid downto low
5 sum = sum + A[mid]
6 if sum > left-sum
7 max-left = i
8 left-sum = sum
9 right-sum = 0
10 sum = 0
11 max-right = 0
12 for i = mid + 1 to high
13 sum = sum + A[i]
14 if sum > right-sum
15 max-right = i
16 right-sum = sum;
17 return {
max-left, max-right, left-sum + right-sum }
/* ——————————————————————————————————————————————————————
* 分治算法
* —————————————————————————————————————————————————————— */
Divide_And_Conquer_Solution(A, low, high)
1 if high == low
2 return {
low, high, A }
3 else
4 mid = (low + high) / 2
5 (left-low, left-high, left-sum) = Divide_And_Conquer_Solution(A, low, mid)
6 (right-low, right-high, right-sum) = Divide_And_Conquer_Solution(A, mid + 1, high)
7 (cross-low, cross-high, cross-sum) = FIND_MAX_CROSSING_SU