最大子数组的递归实现

来源:互联网 发布:数据库主键有什么用 编辑:程序博客网 时间:2024/05/20 11:28

源代码

//找最大子数组 数组索引从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、基本情况和递归情况都要有返回值

0 0
原创粉丝点击