对于一个连续的数组a[n],要求连续子数组,使得该子数组的和最大。比如数组{13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7},最大子数组为{18,20,-7,12},和为32。
方法一:穷举法。即将任取数组中的两个元素,算出两者之间(包括这两个元素本身)所有元素之和。穷举所有组合,比较得到最大值。该方法复杂度为n的三次方。
#include <stdio.h>
#include <limits.h>
int sort(int *,int,int);
main()
{
int a[16] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
printf("%d\n",sort(a,0,15));
}
int sort(int *a,int low,int high)
{
int i,j,k,sum,max_sum;
max_sum = INT_MIN;
for (i = low;i <= high;i++) {
for (j = low+1;j <= high;j++) {
sum = 0;
for (k = i;k <= j;k++) {
sum += a[k];
}
if (sum > max_sum)
max_sum = sum;
}
}
return max_sum;
}
方法二:递归法。以数组中间元素为分界,将整个数组分为左边的数组和右边数组。那么最大子数组有三种情况,分别是完全位于左数组,完全位于右数组以及横跨中间元素的数组。分别对左右数组进