代码段1:
#include <stdio.h>
//显示数组信息
void showArray(int array[], int len);
//求和
int add(int array[], int start, int end);
int max(int array[], int start, int end);
int mix(int array[], int start, int end);
int main(void)
{
//原始数组
int array1[] = {100, 113, 110, 85, 105, 102, 86, 63, 81, 101, 94, 106, 101, 79, 94, 90, 97}, len = 17, sum = 0, start = 0, end = 0;
showArray(array1, len);
//方法1:根据原始数组,遍历找出差价最高的一对
for (int i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)
{
if (sum < (array1[j] - array1[i]))
{
sum = array1[j] - array1[i];
start = i;
end = j;
}
}
}
printf("The start postion is %d,end postion is %d,sum is %d\n", start, end, sum);
//初始化
start = 0;
end = 0;
sum = 0;
//差价数组
int array2[] = {0, 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
showArray(array2, len);
//方法2:根据差价数组,遍历找出加和最高的一对
for (int i = 1; i < len; i++)
{
int j = 0;
while (j + i < len)
{
if (sum < add(array2, j, j + i))
{
sum = add(array2, j, j + i);
start = j;
end = j + i;
}
j++;
}
}
printf("The start postion is %d,end postion is %d,sum is %d\n", start, end, sum);
showArray(array2, 16);
sum = max(array2, 0, 16);
printf("sum is %d\n", sum);
}
void showArray(int array[], int len)
{
for (int i = 0; i < len; i++)
{
printf("%5d", array[i]);
}
printf("\n");
}
int add(int array[], int start, int end)
{
int sum = 0;
for (int i = start; i <= end; i++)
{
sum += array[i];
}
return sum;
}
int mix(int array[], int start, int end)
{
}
int max(int array[], int start, int end)
{
if (start == end)
{
return array[start];
}
int lstart = start, lend = (start + end) / 2, rstart = lend + 1, rend = end, lmax = 0, mmax = 0, rmax = 0, mstart = 0, mend = 0;
for (int i = lend; i >= 0; i--)
{
if (lmax < add(array, i, lend))
{
lmax = add(array, i, lend);
mstart = i;
}
}
for (int j = rstart; j <= rend; j++)
{
if (rmax < add(array, rstart, j))
{
rmax = add(array, rstart, j);
mend = j;
}
}
mmax = add(array, mstart, mend);
lmax = mmax > max(array, rstart, rend) ? mmax : max(array, rstart, rend);
rmax = mmax > max(array, rstart, rend) ? mmax : max(array, rstart, rend);
return lmax > rmax ? lmax : rmax;
}
代码段2:
#include <stdio.h>
struct subary
{
int start, end, sum;
};
//显示数组信息
void showArray(int array[], int len);
//求和
int add(int array[], int start, int end);
struct subary max(int array[], int start, int end);
int main(void)
{
//差价数组
int array2[] = {0, 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7}, len = 17;
showArray(array2, len);
struct subary result = max(array2, 0, 16);
printf("The start position is %d,end positioni is %d,sum is %d", result.start, result.end, result.sum);
}
void showArray(int array[], int len)
{
for (int i = 0; i < len; i++)
{
printf("%5d", array[i]);
}
printf("\n");
}
int add(int array[], int start, int end)
{
int sum = 0;
for (int i = start; i <= end; i++)
{
sum += array[i];
}
return sum;
}
struct subary max(int array[], int start, int end)
{
if (start == end)
{
struct subary result;
result.start = start;
result.end = end;
result.sum = add(array, start, end);
return result;
}
int lstart = start, lend = (start + end) / 2, rstart = lend + 1, rend = end, lmax = 0, mmax = 0, rmax = 0, mstart = 0, mend = 0;
struct subary lsub, msub, rsub;
for (int i = lend; i >= 0; i--)
{
if (lmax < add(array, i, lend))
{
lmax = add(array, i, lend);
mstart = i;
}
}
for (int j = rstart; j <= rend; j++)
{
if (rmax < add(array, rstart, j))
{
rmax = add(array, rstart, j);
mend = j;
}
}
msub.start = mstart;
msub.end = mend;
msub.sum = add(array, mstart, mend);
lsub = msub.sum > max(array, lstart, lend).sum ? msub : max(array, lstart, lend);
//lsub = max(array, lstart, lend);
rsub = msub.sum > max(array, rstart, rend).sum ? msub : max(array, rstart, rend);
//rsub = max(array, rstart, rend);
//result = msub.sum > lsub.sum ? msub : lsub;
return lsub.sum > rsub.sum ? lsub : rsub;
}
最大子数组
最新推荐文章于 2024-03-19 13:55:03 发布