源代码
//找最大子数组 数组索引从0开始
//2014-2-23
#include <iostream>
using namespace std;
int* FindMiddle(int* array, int low, int high, int middle);
int* FindMax(int* array, int low, int high);
extern int* gresult;
int main()
{
int array[10];
cout << "请输入十个数字:" ;
for (int i = 0; i < 10; ++ i)
cin >> array[i];
int* result = FindMax(array, 0, 9);
cout << result[0] << " " << result[1] << " " << result[2] << endl;
delete [] gresult;
return 0;
}
int* gresult = new int[3];
int* FindMiddle(int* array, int low, int high, int middle)
{
int leftSum = array[middle];
int rightSum = array[middle + 1];
gresult[0] = middle;
gresult[1] = middle + 1;
gresult[2] = leftSum + rightSum;
int sum = 0;
for (int i = middle; i >= low; -- i)
{
sum += array[i];
if (sum > leftSum)
{
leftSum = sum;
gresult[0] = i;
}
}
sum = 0;
for (i = middle + 1; i <= high; ++ i)
{
sum += array[i];
if (sum > rightSum)
{
rightSum = sum;
gresult[1] = i;
}
}
gresult[2] = leftSum + rightSum;
return gresult;
}
int* FindMax(int* array, int low, int high)
{
int* r1 = new int[3];
int* r2 = new int[3];
int* r3 = new int[3];
if (low == high)
{
gresult[0] = gresult[1] = low;
gresult[2] = array[low];
return gresult;
}
else
{
int middle = (low + high) / 2;
int* ptmp;
ptmp = FindMax(array, low, middle);
r1[0] = ptmp[0];
r1[1] = ptmp[1];
r1[2] = ptmp[2];
ptmp = FindMax(array, middle + 1, high);
r2[0] = ptmp[0];
r2[1] = ptmp[1];
r2[2] = ptmp[2];
ptmp = FindMiddle(array, low, high, middle);
r3[0] = ptmp[0];
r3[1] = ptmp[1];
r3[2] = ptmp[2];
if (r1[2] >= r2[2] && r1[2] >= r3[2])
{
gresult[0] = r1[0];
gresult[1] = r1[1];
gresult[2] = r1[2];
delete []r1;
delete []r2;
delete []r3;
return gresult;
}
else if (r2[2] >= r1[2] && r2[2] >= r3[2])
{
gresult[0] = r2[0];
gresult[1] = r2[1];
gresult[2] = r2[2];
delete []r1;
delete []r2;
delete []r3;
return gresult;
}
else
{
gresult[0] = r3[0];
gresult[1] = r3[1];
gresult[2] = r3[2];
delete []r1;
delete []r2;
delete []r3;
return gresult;
}
}
}
注意:
1、递归是要将问题分解为最小的子问题
2、基本情况和递归情况都要有返回值