假定要寻找子数组A[low, high] 的最大子数组。
使用分治法:将子数组划分为两个规模尽量相等的子数组。也就是说,找到子数组的中央位置--mid,然后考虑求解子数组A[low...mid], A[mid+1, high]。A的任何子数组所处的位置必然是以下三种情况之一:
完全位于子数组A[low...mid]中,因此 low<= i <= j <= mid
完全位于子数组A[mid+1...high]中, 因此mid < i <= j <= high
跨越了中点,因此 low <= i <= j <=high
因此,最大子数组必然是完全位于A[low...mid]中、完全位于A[mid+1...high]中、或者跨越中点的所有子数组中的最大者。我们可以递归求解A[low...mid], A[mid+1, high]的最大子数组,因为这两个问题仍是最大子数组问题,只是规模更小。剩下的全部工作就是寻找cross-mid的最大子数组,然后在三种情况中选取和最大者
def find-max-crossing-subarray(A, low, mid, high):
left-sum = -sys.maxint
sum = 0
for i in range(mid, low):
sum = sum + A[i]
if sum > left-sum
left-sum = sum
max-left = i
right-sum = -sys.maxint
sum = 0
for j in range(mid + 1, high):
sum = sum + A[j]
if sum > right-sum:
right-sum = sum
max-right = j
return (max-left, max-right, left-sum + right-sum)
def find-maximum-subarray(A, low, high):
if high == low
return (low, high, A[low])
else: mid = (low + high)/2
left-low, left-high, left-sum = find-maximum-subarray(A, low, mid)
rignt-low, right-high, right-sum = find-maximum-subarray(A, mid+1, high)
cross-low, cross-high, cross-sum = find-maximum-crossing-subarray(A, low, mid, high)
if left-sum >= right-sum and left-sum >= cross-sum:
return(left-low, left-high, left-sum)
elseif right-sum >= left-sum and right sum >= cross-sum:
return(right-low, right-high, right-sum)
else return (cross-low, cross-high, cross-sum)