一、伪代码:
第四章-4.1-最大子数组问题
FIND-MAX-CROSSING-SUBARRAY(A,low,mid,high)
1 left-sum = -∞ //寻找左边边界i和左边最大值left-sum
2 sum = 0
3 for i = mid downto low
4 sum = sum + A[i]
5 if sum > left-sum //如果sum大于left-sum时,记录新的sum值与此时边界的下标
6 left-sum = sum
7 max-left = i
8 right-sum = -∞
9 sum = 0
10 for j = mid + 1 to high //寻找右边边界j和右边最大值right-sum
11 sum = sum + A[j]
12 if sum > right-sum
13 right-sum = sum
14 max-right = j
15 return(max-left,max-right,left-sum + right-sum) //返回左右边界i和j与最大子数组总和
FIND-MAXIMUM-SUBARRAY(A,low,high)
1 if high == low //在递归过程中,high=low的时候为转折点
2 return(low,high,A[low])
3 else mid = ⌊(low + high) / 2 ⌋
//通过递归求出left-sum和right-sum以及各自的边界
4 (left-low,left-high,left-sum) =
FIND-MAXIMUM-SUBARRAY(A,low,mid)
5 (right-low,right-high,right-sum) =
FIND-MAXIMUM-SUBARRAY(A,mid+1,high)
//调用FIND-MAX-CROSSING-SUBARRAY()求出cross-sum以及边界
6 (cross-low,cross-high,cross-sum) =
FIND-MAX-CROSSING-SUBARRAY(A,low,mid,high)
//三者互相比较,找出和最大的(子数组)
7 if left-sum >= right-sum and left-sum >= cross-sum
8 return(left-low,left-high,left-sum)
9 elseif right-sum >= left-sum and right-sum >= cross-sum
10 return(right-low,right-high,right-sum)
11 else return(cross-low,cross-high,cross-sum)
二、正式代码
# include <iostream>
using namespace std;
const int Infinite = - 10000 ;
int FindMaxCrossSubarray ( int A[ ] , int low, int mid, int high)
{
cout << "调用FindMaxCrossSubarray" << endl;
int left_sum = Infinite;
int sum = 0 ;
for ( int i = mid; i >= low; i-- )
{
sum += A[ i] ;
if ( sum > left_sum)
{
left_sum = sum;
}
}
int right_sum = Infinite;
sum = 0 ;
for ( int i = mid + 1 ; i <= high; i++ )
{
sum += A[ i] ;
if ( sum > right_sum)
{
right_sum = sum;
}
}
return left_sum + right_sum;
}
int FindMaxSubarray ( int A[ ] , int low, int high)
{
cout << "调用FindMaxSubarray" << endl;
int left_sum, right_sum, cross_sum;
if ( high == low)
{
return A[ low] ;
}
else
{
int mid = ( low + high) / 2 ;
left_sum = FindMaxSubarray ( A, low, mid) ;
right_sum = FindMaxSubarray ( A, mid + 1 , high) ;
cross_sum = FindMaxCrossSubarray ( A, low, mid, high) ;
if ( left_sum >= right_sum && left_sum >= cross_sum) {
cout << "返回left_sum" << endl;
cout << left_sum << endl;
return left_sum;
}
else if ( right_sum >= left_sum && right_sum >= cross_sum) {
cout << "返回right_sum" << endl;
cout << right_sum << endl;
return right_sum;
}
else {
cout << "返回cross_sum" << endl;
cout << cross_sum << endl;
return cross_sum;
}
}
}
int main ( )
{
int a[ ] = { 13 , - 3 , - 25 , 20 , - 3 , - 16 , - 23 , 18 , 20 , - 7 , 12 , - 5 , - 22 , 15 , - 4 , 7 } ;
int length = sizeof ( a) / sizeof ( int ) ;
cout << FindMaxSubarray ( a, 0 , length - 1 ) << endl;
return 0 ;
}