《算法导论》中求最大子数组的C++实现

#include<iostream>
#include<vector>

using namespace std;

#define Minium -10000

typedef struct Node{  //return type 
	int low;
	int high;
	int sum;
}Node;

//分治方法求最大子数组
//p为起点 r为终点,mid为中点
Node Find_Max_Subarry(vector<int> &A, int p, int r);
Node Find_CrossMax_Subarry(vector<int> &A, int p, int mid, int r);

int main(void)
{	
	//第一个元素0仅填充空间
	vector<int> A = { 0,13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7 };
	int len = A.size();
	Node res;
	res = Find_Max_Subarry(A, 1, 16);  //求最大子数组
	cout << res.low << " " << res.high << " " << res.sum << endl;
	return 0;
}

//当最大子数组横跨中点时
Node Find_CrossMax_Subarry(vector<int> &A, int p, int mid, int r)
{
	Node left, right, Res;
	int i;
	int MaxSumL = Minium;
	int MaxSumR = Minium;
	left.sum = right.sum = 0;
	for (i = mid; i >= p; i--)
	{
		left.sum += A[i];
		if (left.sum > MaxSumL)
		{
			MaxSumL = left.sum;
			left.low = i;
		}
	}
	for (i = mid+1; i <= r; i++)
	{
		right.sum += A[i];
		if (right.sum > MaxSumR)
		{
			MaxSumR = right.sum;
			right.high = i;
		}
	}
	Res.low = left.low;
	Res.high = right.high;
	Res.sum = MaxSumL + MaxSumR;
	return Res;
}


Node Find_Max_Subarry(vector<int> &A, int low, int high)
{
	Node Res, left, right, Cross;
	int mid;
	if (low == high)
	{
		Res.low = low;
		Res.high = high;
		Res.sum = A[low];
		return Res;
	}
	else
	{
		mid = (int)((high + low) / 2);
		left = Find_Max_Subarry(A, low, mid);
		right = Find_Max_Subarry(A, mid + 1, high);
		Cross = Find_CrossMax_Subarry(A, low, mid, high);

		if (left.sum >= right.sum && left.sum >= Cross.sum)
			return left;
		if (right.sum >= left.sum && right.sum >= Cross.sum)
			return right;
		if (Cross.sum >= right.sum && Cross.sum >= left.sum)
			return Cross;
	}
	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值