#include <iostream>
using namespace std;
struct MaxSubArray
{
int low;
int high;
int sum;
MaxSubArray(int InLow, int InHigh, int InSum)
{
low = InLow;
high = InHigh;
sum = InSum;
}
};
MaxSubArray FindCrowwMaxSubArray(int list[], int low, int mid, int high)
{
int Sum = 0;
int LeftMax = -1000000000;
int LeftIndex = mid;
for (int i = mid; i >= low; i--)
{
Sum += list[i];
if (Sum > LeftMax)
{
LeftMax = Sum;
LeftIndex = i;
}
}
Sum = 0;
int RightMax = -1000000000;
int RightIndex = mid + 1;
for (int i = mid + 1; i <= high; i++)
{
Sum += list[i];
if (Sum > RightMax)
{
RightMax = Sum;
RightIndex = i;
}
}
return MaxSubArray(LeftIndex, RightIndex, LeftMax + RightMax);
}
MaxSubArray FindMaxSubArray(int list[], int low, int high)
{
if (low == high)
{
return MaxSubArray(low, high, list[low]);
}
else
{
int mid = (low + high) / 2;
MaxSubArray LeftMaxSubArray = FindMaxSubArray(list, low, mid);
MaxSubArray RightMaxSubArray = FindMaxSubArray(list, mid + 1, high);
MaxSubArray CrossMaxSubArray = FindCrowwMaxSubArray(list, low, mid, high);
if (LeftMaxSubArray.sum > RightMaxSubArray.sum && LeftMaxSubArray.sum > CrossMaxSubArray.sum)
{
return LeftMaxSubArray;
}
else if (RightMaxSubArray.sum > LeftMaxSubArray.sum && RightMaxSubArray.sum > CrossMaxSubArray.sum)
{
return RightMaxSubArray;
}
else
{
return CrossMaxSubArray;
}
}
}
MaxSubArray FindMaxCrossSubArray(int list[], int low, int mid, int high)
{
}
int main()
{
int ShareClosedPrice[15] = {32, 52, 1, 48, 65, 25, 43, 9, 16, 73, 56, 89, 106, 27, 35};
int DifferenceList[14];
for (int i = 1; i < sizeof(ShareClosedPrice) / sizeof(int); i++)
{
DifferenceList[i - 1] = ShareClosedPrice[i] - ShareClosedPrice[i - 1];
}
cout << "DifferenceList: ";
for (int i = 0; i < sizeof(DifferenceList) / sizeof(int); i++)
{
cout << DifferenceList[i] << ", ";
}
cout << endl;
MaxSubArray MaxSubList = FindMaxSubArray(DifferenceList, 0, 13);
cout << "MaxSubList: " << MaxSubList.low <<" , " << MaxSubList.high<<" , "<<MaxSubList.sum;
cout << endl;
getchar();
return 0;
}