算法导论-Python实现-最大子数组

最大子数组:
最大子数组是求数组中连续的子数组的和最大。
用分治法的思想去求解,先将数组对半分,最大子数组的位置有三种情况:
1.子数组全部在中点的右边
2.子数组全部在中点的左边。
3.子数组部分在中点的左边,另一部分在中点的右边。
只要分别求出这三种情况的最大值比较,取最大的即为最大子数组
如下是数组A = [13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7] 最大子数组的结果(图中是从1开始标注,而数组是从0开始的)
这里写图片描述
Python实现代码:

def  Find_Max_Crassing_Subarray(A, low, mid, high):
    left_sum = -4399
    sum = 0
    for i in range(mid, low-1, -1):
        sum = sum + A[i]
        if sum > left_sum:
            left_sum = sum
            max_left = i
    right_sum = -4399
    sum = 0
    for j in range(mid+1, high+1):
        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 = int((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_Crassing_Subarray(A, low, mid, high)
        if left_sum >= right_sum & left_sum >= cross_sum:
            return (left_low, left_high, left_sum)
        elif right_sum >= left_sum & right_sum >= cross_sum:
            return (right_low, right_high, right_sum)
        else:
            return (cross_low, cross_high, cross_sum)


A = [13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
print('The Array:', A)
(low, high, sum) = Find_Maximum_Subarray(A, 0, len(A)-1)
print('start:', low, 'end:', high, 'sum:', sum)

程序运行结果:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值