第三章看了由于数学基础不是太好,看的似懂非懂,有点模糊,就跳过去了。等有时间了好好学下数学,然后重头再看一遍。以下是最大子数组的递归算法和暴力算法的C++实现,递归算法是按着伪代码写的
#include "stdafx.h"
#include <iostream>
using namespace std;
int findMaxCorssingSubarray(int a[], int low, int mid, int high);
int findMaximumSubarray(int a[], int low, int high);
int main(){
int a[] = { 13, -3, -25, 20, -3, -16, -23, 18, 20 - 7, 12, -5, -22, 15, -4, 7 };
cout << findMaximumSubarray(a,0,15) << endl;
return 0;
}
int findMaximumSubarray(int a[], int low, int high){
if (low == high)
{
return a[low];
}
else
{
int mid = (low + high) / 2;
int leftSum = findMaximumSubarray(a, low, mid);
int rightSum = findMaximumSubarray(a, mid + 1, high);
int crossSum = findMaxCorssingSubarray(a, low, mid, high);
if (leftSum >= rightSum && leftSum >= crossSum)
{
return leftSum;
}
else if(rightSum>=leftSum && rightSum>=crossSum)
{
return rightSum;
}
else
{
return crossSum;
}
}
}
int findMaxCorssingSubarray(int a[], int low, int mid, int high){
int leftSum = -100000; //
int sum = 0;
int left;
for (size_t i = mid; i > low;--i)
{
sum += a[i];
if (sum > leftSum){
leftSum = sum;
left = i;
}
}
int rightSum = -1000000;
sum = 0;
int right;
for (size_t i = mid + 1; i <= high;++i)
{
sum += a[i];
if (sum > rightSum){
rightSum = sum;
right = i;
}
}
return leftSum + rightSum;
}
int findMaximumSubarrayEx(int a[],int high){
int sum = 0;
int maxSum = -1000000;
for (size_t i = 0; i <= high;i++)
{
for (size_t j = i; j <= high;j++)
{
sum += a[j];
if (sum > maxSum){
maxSum = sum;
}
}
sum = 0;
}
return maxSum;
}
int findMaximumSubarrayLi(int a[], int high){
int sum = 0;
int maxSum = -1000000;
for (size_t i = 0; i <= high;i++)
{
sum += a[i];
if (sum < 0){
sum = 0; //一旦当前的和小于0就说明之前的元素+后面的元素不可能会构成最大子数组,所以让和重新为0开始重新处理
}
if (sum > maxSum){
maxSum = sum;
}
}
return maxSum;
}