以下为算法导论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");
}