最大子数组问题实现

以下为算法导论4.1节最大子数组问题实现代码

#include <iostream>

using std::cout;
using std::endl;

struct strMax_subarray
{
	unsigned long ulMaxLeft;// the left max index
	unsigned long ulMaxRight;// the right max index
	double dSum;// the sum of numbers in the subarray
};

// find the max crossing subarray
void Find_max_crossing_subarray(double* t_dpSeq, unsigned long t_ulLow,
	unsigned long t_ulMid, unsigned long t_ulHigh,strMax_subarray* t_sMsarray)
{
	double dLeftSum = -1e10, dSum = 0, dRightSum = dLeftSum;
	unsigned long ulMaxLeft, ulMaxRight;

	for (long lIndex = t_ulMid; lIndex >= (long)t_ulLow; lIndex--)
	{
		dSum += t_dpSeq[lIndex];
		if (dSum > dLeftSum)
		{
			dLeftSum = dSum;
			ulMaxLeft = lIndex;
		}
	}
	dSum = 0;
	for (unsigned long ulIndex = t_ulMid + 1; ulIndex <= t_ulHigh; ulIndex++)
	{
		dSum += t_dpSeq[ulIndex];
		if (dSum > dRightSum)
		{
			dRightSum = dSum;
			ulMaxRight = ulIndex;
		}
	}
	t_sMsarray->ulMaxLeft = ulMaxLeft;
	t_sMsarray->ulMaxRight = ulMaxRight;
	t_sMsarray->dSum = dLeftSum + dRightSum;
}

// find the max subarray
void Find_max_subarray(double* t_dpSeq, unsigned long t_ulLow, unsigned long t_ulHigh, strMax_subarray* t_sMsarray)
{
	unsigned long ulMiddle;
	strMax_subarray sMsarray_left, sMsarray_right, sMsarray_cross;
	if (t_ulHigh == t_ulLow)
	{
		t_sMsarray->ulMaxLeft = t_ulLow;
		t_sMsarray->ulMaxRight = t_ulHigh;
		t_sMsarray->dSum = t_dpSeq[t_ulHigh];
	}
	else
	{
		ulMiddle = (t_ulLow + t_ulHigh) / 2;
		Find_max_subarray(t_dpSeq, t_ulLow, ulMiddle, &sMsarray_left);
		Find_max_subarray(t_dpSeq, ulMiddle + 1, t_ulHigh, &sMsarray_right);
		Find_max_crossing_subarray(t_dpSeq, t_ulLow, ulMiddle, t_ulHigh, &sMsarray_cross);
		if (sMsarray_left.dSum > sMsarray_right.dSum && sMsarray_left.dSum > sMsarray_cross.dSum)
		{
			t_sMsarray->ulMaxLeft = sMsarray_left.ulMaxLeft;
			t_sMsarray->ulMaxRight = sMsarray_left.ulMaxRight;
			t_sMsarray->dSum = sMsarray_left.dSum;
		}
		else if (sMsarray_right.dSum > sMsarray_left.dSum && sMsarray_right.dSum > sMsarray_cross.dSum)
		{
			t_sMsarray->ulMaxLeft = sMsarray_right.ulMaxLeft;
			t_sMsarray->ulMaxRight = sMsarray_right.ulMaxRight;
			t_sMsarray->dSum = sMsarray_right.dSum;
		}
		else
		{
			t_sMsarray->ulMaxLeft = sMsarray_cross.ulMaxLeft;
			t_sMsarray->ulMaxRight = sMsarray_cross.ulMaxRight;
			t_sMsarray->dSum = sMsarray_cross.dSum;
		}
	}
}

int main()
{
	double dSeq[16] = { 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7 };
	unsigned long ulSeqLen = 16;
	strMax_subarray sMsArray;
	Find_max_subarray(dSeq, 0, ulSeqLen - 1, &sMsArray);
	cout << "Left:  " << sMsArray.ulMaxLeft + 1 << endl;
	cout << "Right:  " << sMsArray.ulMaxRight + 1<< endl;
	cout << "Sum:  " << sMsArray.dSum << endl;
	system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值