问题描述:
在一个包含负数的数组中,找出和最大的子数组。
算法描述:
使用分治策略,将数组划分为两个规模尽量相等的子数组。也就是找到数组的中央位置mid。然后考虑求解A[low..mid],A[mid+1,high]。
最大子数组必然为下列三种情况之一:
1.位于A[low..mid],完全位于左数组
2.位于A[mid+1..high],完全位于右数组
3.位于A[i..mid..j],即跨越了中点,且 low<=i<=mid<=j<=high
python实现:
#跨越了中点的最大数组
def max_subArray_inMid(ary,low,mid,high): max_sum = -100000 left_index=right_index = mid sum = 0 i = mid while low<=i: sum+=ary[i] if sum > max_sum: max_sum = sum left_index = i i-=1 i = mid + 1 sum = max_sum while i <= high: sum+=ary[i] if sum > max_sum: max_sum = sum right_index = i i+=1 return (max_sum,left_index,right_index) #没有跨越中点的最大数组 def max_subArray(ary,low,high): if(low == high): return (ary[low],low,high) mid = int((low+high)/2) (left_max,left_left,left_right) = max_subArray(ary,low,mid) (right_max,right_left,right_right) = max_subArray(ary,mid+1,high) (mid_max,mid_left,mid_right) = max_subArray_inMid(ary,low,mid,high) if left_max > right_max and left_max > mid_max: return (left_max,left_left,left_right) elif right_max > left_max and right_max > mid_max: return (right_max,right_left,right_right) else: return(mid_max,mid_left,mid_right) ary = [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7] print(max_subArray(ary,0,len(ary)-1))