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

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

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

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

/** 最大子段算法程序*/#include <stdio.h>
#include <stdlib.h>
#include <time.h>#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];elsemaxsum = 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;elsemaxsum = 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];elsemaxsum = 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;elsemaxsum = midsum;if(maxsum < rightsum)maxsum = rightsum;}return maxsum;
}

计算最大子段(分治法)相关推荐

  1. 三大算法之一:分治法(带你用分治法思想优化程序,计算降低复杂算法的时间复杂度)

    目录 ​ 零.前言 1.分治法 1.含义 2.分治法主要思想 3.分治法的求解步骤 1.确定初始条件 2.计算每一部分的时间复杂度 3.合并时间复杂度 4.求解 3.最大最小值问题 1.问题描述 2. ...

  2. 趣学算法系列-分治法

    趣学算法系列-分治法 声明:本系列为趣学算法一书学习总结内容,在此推荐大家看这本算法书籍作为算法入门, 原作者博客链接,本书暂无免费电子版资源,请大家支持正版,更多实例分析请查看原书内容 第三章 分治 ...

  3. 分治法 分治法求解递推式

    分治法 分治法基本就是下面的三步 分(divide):无法有效解决的划分更小的问题 治(conquer):递归求每一个子问题的解 合(combine):合并解得出原问题解 MergeSort:排列 1 ...

  4. 计算最大值和最小值(分治法)

    分治法计算最大值和最小值,是一个经典的算法程序. 原始数据使用随机函数生成. 采用结构化程序设计,可以很容易改为从标准输入或文件读入数据,只需要修改函数getData即可. 数据个数由宏定义给出,也可 ...

  5. 分治法解决计算凸包问题

    清华大学的邓俊辉老师的<计算几何>公开课中,在计算凸包问题时会遇到极点法和极边法: 极点法是假设所有的点都是凸包上的点,然后根据In-triangle测试,把去除不是极点的点,时间复杂度是 ...

  6. c语言分治法求众数重数_分治法实现众数问题--例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3。对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数。...

    题目的描述: 例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3. 对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数. 众数------一组元素中出现的次数是最多的 重 ...

  7. 分治法的计算时间、时间复杂度推导以及经典算法分析

    分治是一种解决复杂问题的思想,它可以将一个问题划分成多个小的问题,通过合并这些问题求得原问题的解.本文对分治法进行复杂性分析,并通过这种方法分析几个具体算法的时间复杂度. 文章目录 1 分治法的复杂性 ...

  8. 关于分治法的时间复杂度计算

    分治法时间复杂度求解秘籍 分治法的道理非常简单,就是把一个大的复杂的问题分为a(a>1)个形式相同的子问题,这些子问题的规模为n/b,如果分解或者合并的复杂度为f(n),那么总的时间复杂度可以表 ...

  9. java分治法求数列的最大子段和_同事为进大厂天天刷Java面试题,面试却履败!究其原因竟是它在捣鬼。...

    写在前面 疫情过后,招聘与求职受影响到底有多大?我不知道,但我的真实感受是,即使有疫情的影响,最近还是持续有朋友来跟我说他们今年工作的新动向.有人跳槽去了大厂,有人下定决心出来创业,也有人还在观望,等 ...

最新文章

  1. 挥手送别 2019,翘首期待 2020
  2. Xcode 6 Bug:Interface Builder文件中的未知类
  3. 浅谈Java中的Set、List、Map的区别
  4. msp430g2553串口接受数据_MSP430G2553串口通讯 发送接收
  5. aj6 stamps storm_曝光! “渣男”Travis Scott的AJ6下周发售,分手后货量大减...
  6. sublime php快捷键,sublime快捷键
  7. teched2004视频资料下载,又加了5段,全是开发类的
  8. 数字电子钟设计(基于quartus软件)
  9. SpringBoot从入门到精通(全)
  10. 如何说服你的同事使用TDD
  11. 公有云Docker镜像P2P加速之路:安全篇
  12. OpenCV isContinuous()函数简析
  13. I MM CO T-CODE
  14. php国际象棋棋盘,php趣味编程 - php输出国际象棋棋盘 - 小徐
  15. linux 访问西数网盘,西数不认盘,无法访问固件
  16. 大学“电路分析基础”试题合集第四章
  17. 蓝图(Blueprint)理解
  18. 数组的赋值机制和赋值原理
  19. 【Web前端大作业】基于HTML+CSS+JavaScript制作西北大学新闻网站(7页)
  20. 【手把手教你】股票可视化分析之Pyecharts(一)

热门文章

  1. unity anim 组件的使用
  2. 27岁后月薪低于8K,会被淘汰吗?
  3. C#图片处理之:亮度和对比度的校正
  4. 机器人社社长事迹_国际机器人大赛冠军背后的故事
  5. Hive DDL DML
  6. 高德天气 php,天气查询-API文档-开发指南-Web服务 API | 高德地图API
  7. scala中父类的继承
  8. matlab曲面程序,matlab练习程序(曲面拟合)
  9. windows nginx 停止和启动_nginx在window与linux中启动、停止、与关闭
  10. error汇总:dpkg: error processing package *** (--configure)