最大子数组问题(maximum subarray),含负元素时才有求解意义,利用分治法求解,平均时间复杂度O(nlogn):

python 实现:

import sys   

#sys.setrecursionlimit(9)

A = [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]
def find_max_crossing_subarray(A,low,mid,high):
    left_sum = -65535
    sum = 0
    max_left = 0
    for i in range(mid,low-1,-1):
        sum += A[i]
        if sum > left_sum:
            left_sum = sum
            max_left = i

    right_sum = -65535
    sum = 0
    max_right = 0
    for j in range(mid+1,high):
        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)
        (right_low,right_high,right_sum) = find_maximum_subarray(A,mid+1,high)
        (cross_low,cross_high,cross_sum) = find_max_crossing_subarray(A,low,mid,high)

    if left_sum >= right_sum and left_sum >= cross_sum:
        return (left_low,left_high,left_sum)
    elif right_sum >= left_sum and right_sum >= cross_sum:
        return (right_low,right_high,right_sum)
    else:
        return (cross_low,cross_high,cross_sum)

print find_maximum_subarray(A,0,len(A)-1)