博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算最大子段(分治法)
阅读量:6955 次
发布时间:2019-06-27

本文共 2744 字,大约阅读时间需要 9 分钟。

这个程序使用分治法计算最大子段,结果为最大子段之和,用递归程序实现。

原始数据使用随机函数生成。

采用结构化程序设计,可以很容易改为从标准输入或文件读入数据,只需要修改函数getData即可。

数据个数由宏定义给出,也可以轻松地改为输入

/* * 最大子段算法程序 */#include 
#include
#include
#define N 13void getData(int [], int);int maxsumfun(int a[], int left, int right);int main(void){ int a[N], i; getData(a, N); /* 获得数据放入数组a中 */ printf("datas: "); for (i = 0; i < N; i++) printf("%d ", a[i]); printf("\n"); int ms; ms = maxsumfun(a, 0, N - 1); printf("maxsum=%d\n", ms); return 0;}int maxsumfun(int a[], int left, int right){ int maxsum = 0; if(left == right) { if(a[left] > 0) maxsum = a[left]; else maxsum = 0; } else { int mid, leftsum, rightsum, midsum; mid = (left + right) / 2; leftsum = maxsumfun(a, left, mid); rightsum = maxsumfun(a, mid+1, right); int leftsum1 = 0; int lefts = 0; int i; for(i=mid; i>=left; i--) { lefts += a[i]; if(lefts > leftsum1) leftsum1 = lefts; } int rightsum1 = 0; int rights = 0; for(i=mid+1; i<=right; i++) { rights += a[i]; if(rights > rightsum1) rightsum1 = rights; } midsum = leftsum1 + rightsum1; if(midsum < leftsum) maxsum = leftsum; else maxsum = midsum; if(maxsum < rightsum) maxsum = rightsum; } return maxsum;}void getData(int d[], int n){ time_t t; srand((unsigned) time(&t)); /* 设置随机数起始值 */ int i; for(i=0; i < n; i++) d[i] = rand() % 30 - 10; /* 获得-10--20之间的整数值 */}
关键代码:

// 递归计算最大子段int maxsumfun(int a[], int left, int right){    int maxsum = 0;    if(left == right)    {        if(a[left] > 0)            maxsum = a[left];        else            maxsum = 0;    }    else    {        int mid, leftsum, rightsum, midsum;        mid = (left + right) / 2;        leftsum = maxsumfun(a, left, mid);        rightsum = maxsumfun(a, mid+1, right);        int leftsum1 = 0;        int lefts = 0;        int i;        for(i=mid; i>=left; i--)        {            lefts += a[i];            if(lefts > leftsum1)                leftsum1 = lefts;        }        int rightsum1 = 0;        int rights = 0;        for(i=mid+1; i<=right; i++)        {            rights += a[i];            if(rights > rightsum1)                rightsum1 = rights;        }        midsum = leftsum1 + rightsum1;        if(midsum < leftsum)            maxsum = leftsum;        else            maxsum = midsum;        if(maxsum < rightsum)            maxsum = rightsum;    }    return maxsum;}

转载于:https://www.cnblogs.com/tigerisland/p/7564944.html

你可能感兴趣的文章
学习自查:目录(更新中...)
查看>>
JQuery01
查看>>
Java 详解 JVM 工作原理和流程
查看>>
对大学努力的理解
查看>>
name_save matlab
查看>>
Nginx服务器中的Socket切分,需要的朋友可以参考下
查看>>
leetcode 46. 全排列
查看>>
美团点评智能支付核心交易系统的可用性实践
查看>>
关于asp.net中链接数据库的问题
查看>>
kubernetes 1.14安装部署metrics-server插件
查看>>
IEEE754标准浮点格式
查看>>
嵌入式系统内存泄漏检测
查看>>
flAbsPath on /var/lib/dpkg/status failed 解决 Cydia 红字
查看>>
在本地测试一次成功的AJAX请求
查看>>
淘淘商城第二天
查看>>
配置和修改参数
查看>>
DS06--图
查看>>
C#通过XElement写入XML文件
查看>>
1 0 .2 用于监视的工具和技术
查看>>
洛谷2142高精度减法(模板)
查看>>