1、009_maxsubarr_divcon.h

/***************************************************************
*版权所有 (C)2014,长沙铁信交通科技有限公司。
*
*文件名称:009_maxsubarr_divcon.h
*内容摘要:分治法求取最大子数组
*其它说明:
*当前版本:V1.0
*作   者:伍定湘
*完成日期:2014年9月26日
*
*修改记录1:
*   修改日期:2014年9月26日
*   版本号:V1.0
*   修改人:伍定湘
*   修改内容:创建
***************************************************************/#ifndef _MAXSUBARR_DIVCON_H_ //防止头文件被重复引用
#define _MAXSUBARR_DIVCON_H_/**************************************************************
头文件引用
**************************************************************/
#include "typedef.h"//引入内置类型重定义/**************************************************************
相关宏定义
**************************************************************//**************************************************************
相关结构体定义
**************************************************************/
#ifndef _MAXSUBARR_TYPEDEF_ //防止头文件被重复引用
#define _MAXSUBARR_TYPEDEF_
typedef struct
{INT32 iOffsetMaxBegin;INT32 iOffsetMaxEnd;INT32 iSumMax;
}MaxSubArrTypedef;
#endif/**************************************************************
本程序中出现的函数的声明
**************************************************************/
void maxsubarr_divcon(INT32 aTarget[], const INT32 iArrLen);
MaxSubArrTypedef maxsubarr_divcon_find(const INT32 aTarget[], MaxSubArrTypedef msaTarget);
MaxSubArrTypedef maxsubarr_acrossing(const INT32 aTarget[], const INT32 iOffsetBegin, const INT32 iOffsetMid, const INT32 iOffsetEnd);#endif

2、009_maxsubarr_divcon.c

/***************************************************************
*版权所有 (C)2014,长沙铁信交通科技有限公司。
*
*文件名称:009_maxsubarr_divcon.c
*内容摘要:分治法求取最大子数组
*其它说明:
*当前版本:V1.0
*作   者:伍定湘
*完成日期:2014年9月27日
*
*修改记录1:
*   修改日期:2014年9月27日
*   版本号:V1.0
*   修改人:伍定湘
*   修改内容:创建
***************************************************************//**************************************************************
头文件引用
**************************************************************/
#include "typedef.h"//引入内置类型重定义
#include "009_maxsubarr_divcon.h"#include <stdio.h>/**************************************************************
全局变量定义
**************************************************************//**************************************************************
函数实现
**************************************************************//**********************************************************************
*功能描述:分治法求取最大子数组
*输入参数:aTarget - 目标数组
*        iArrLen - 目标数组的长度
*输出参数:
*返回值:
*其它说明:
*修改日期           版本号         修改人        修改内容
* ---------------------------------------------------------------------
*2014年9月27日      V1.0          伍定湘        创建
***********************************************************************/
void maxsubarr_divcon(INT32 aTarget[], const INT32 iArrLen)
{MaxSubArrTypedef msaTarget = { 0, iArrLen - 1, 0 };msaTarget = maxsubarr_divcon_find(aTarget, msaTarget);printf("iSumMax = %d\n", msaTarget.iSumMax);printf("iOffsetMaxBegin = %d\n", msaTarget.iOffsetMaxBegin);printf("iOffsetMaxEnd = %d\n", msaTarget.iOffsetMaxEnd);
}/**********************************************************************
*功能描述:分治法求取最大子数组
*输入参数:aTarget - 目标数组
*        msaTarget - 上一级最大子数组参数
*输出参数:
*返回值:
*其它说明:
*修改日期           版本号         修改人        修改内容
* ---------------------------------------------------------------------
*2014年9月27日      V1.0          伍定湘        创建
***********************************************************************/
MaxSubArrTypedef maxsubarr_divcon_find(const INT32 aTarget[], MaxSubArrTypedef msaTarget)
{/* 单元素数组直接返回, 并同时结束了迭代 */if (msaTarget.iOffsetMaxBegin == msaTarget.iOffsetMaxEnd){msaTarget.iSumMax = aTarget[msaTarget.iOffsetMaxBegin];return(msaTarget);}/* 取中点 */INT32 mid = (msaTarget.iOffsetMaxBegin + msaTarget.iOffsetMaxEnd) / 2;/* 迭代获取左侧最大子数组 */MaxSubArrTypedef msaLeft = {0, 0, 0};//max初始值为0的前提条件是数组值至少有一个正数if (mid > msaTarget.iOffsetMaxBegin)//if语句负责过滤引起'起点大于终点'的情况, 并同时结束了迭代{msaLeft.iOffsetMaxBegin = msaTarget.iOffsetMaxBegin;msaLeft.iOffsetMaxEnd = mid - 1;msaLeft.iSumMax = 0;msaLeft = maxsubarr_divcon_find(aTarget, msaLeft);}/* 迭代获取右侧最大子数组 */MaxSubArrTypedef msaRight = { 0, 0, 0 };if (mid < msaTarget.iOffsetMaxEnd)//if语句负责过滤引起'起点大于终点'的情况, 并同时结束了迭代{        msaRight.iOffsetMaxBegin = mid + 1;msaRight.iOffsetMaxEnd = msaTarget.iOffsetMaxEnd;msaRight.iSumMax = 0;msaRight = maxsubarr_divcon_find(aTarget, msaRight);}/* 迭代获取跨中点最大子数组 */MaxSubArrTypedef msaAcrossMid = maxsubarr_acrossing(aTarget, msaTarget.iOffsetMaxBegin, mid, msaTarget.iOffsetMaxEnd);/* 获取三者中和最大的 */msaTarget = msaAcrossMid;msaTarget = msaTarget.iSumMax > msaLeft.iSumMax ? msaTarget : msaLeft;msaTarget = msaTarget.iSumMax > msaRight.iSumMax ? msaTarget : msaRight;/* 返回三者中和最大的 */return(msaTarget);
}
/**********************************************************************
*功能描述:分治法求取跨过中点的最大子数组
*输入参数:aTarget - 目标数组
*        iOffsetBegin - 目标数组的起点下标
*        iOffsetMid - 目标数组跨过的中点下标
*        iOffsetEnd - 目标数组的终点下标
*输出参数:
*返回值:
*其它说明:
*修改日期           版本号         修改人        修改内容
* ---------------------------------------------------------------------
*2014年9月27日      V1.0          伍定湘        创建
***********************************************************************/
MaxSubArrTypedef maxsubarr_acrossing(const INT32 aTarget[], const INT32 iOffsetBegin, const INT32 iOffsetMid, const INT32 iOffsetEnd)
{/* 中点左侧参数 */INT32 iOffsetLeft = iOffsetMid;INT32 iOffsetMaxLeft = iOffsetMid;INT32 iSumMaxLeft = aTarget[iOffsetMid];/* 中点右侧参数 */INT32 iOffsetRight = iOffsetMid;INT32 iOffsetMaxRight = iOffsetMid;INT32 iSumMaxRight = aTarget[iOffsetMid];/* 求和参数 */INT32 iSum;INT32 iOffset;/* 输出结果 */MaxSubArrTypedef msaAcrossMid = { iOffsetMid, iOffsetMid, aTarget[iOffsetMid] };/* 反向扫描包含iOffsetMid元素左侧的最大子数组 */for (; iOffsetLeft >= iOffsetBegin; iOffsetLeft--){iSum = 0;for (iOffset = iOffsetLeft; iOffset <= iOffsetMid; iOffset++)//求取数组从下标iOffsetLeft到iOffsetMid的元素总和,注意:请勿遗漏等号{iSum += aTarget[iOffset];}if (iSum > iSumMaxLeft)//如果新的和大,更新左侧最大的子数组元素之和iSumMaxLeft以及此时子数组起始下标iOffsetMaxLeft{iSumMaxLeft = iSum;iOffsetMaxLeft = iOffsetLeft;}}/* 正向扫描包含iOffsetMid元素右侧的最大子数组 */for (; iOffsetRight <= iOffsetEnd; iOffsetRight++){iSum = 0;for (iOffset = iOffsetMid; iOffset <= iOffsetRight; iOffset++)//求取数组从下标iOffsetMid到iOffsetRight的元素总和,注意:请勿遗漏等号{iSum += aTarget[iOffset];}if (iSum > iSumMaxRight)//如果新的和大,更新右侧最大的子数组元素之和iSumMaxRight以及此时子数组起始下标iOffsetMaxRight{iSumMaxRight = iSum;iOffsetMaxRight = iOffsetRight;}}/* 输出结果 */msaAcrossMid.iSumMax = iSumMaxLeft + iSumMaxRight - aTarget[iOffsetMid];msaAcrossMid.iOffsetMaxBegin = iOffsetMaxLeft;msaAcrossMid.iOffsetMaxEnd = iOffsetMaxRight;return(msaAcrossMid);
}

【算法】_012_最大子数组_分治法相关推荐

  1. 算法设计思想(4)— 分治法

    1. 分治法概念 分治,顾名思义,分而治之. 具体来说,它先将一个难以直接解决的大问题,分割成一些可以直接解决的小问题.如果分割后的问题仍然无法直接解决,那么就继续递归地分割,直到每个小问题都可解. ...

  2. 深大算法设计与分析实验二——分治法求最近点对问题

    源代码: 深大算法设计与分析实验二--分治法求最近点对问题代码-C/C++文档类资源-CSDN下载 目录 实验问题 一.实验目的: 二.内容: 三.算法思想提示 产生不重复的随机点算法: 蛮力算法: ...

  3. 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的众数及其重数. 众数------一组元素中出现的次数是最多的 重 ...

  4. 算法复习笔记(三)分治法

    算法复习笔记(三)分治法 1.引入语 分治法划分对策: 子问题与原问题相比:问题性质一致,问题规模不同 求解一般分为三个阶段: 1.划分:直到问题足够小可以直接求解为止 2.求解: 3.合并:将子问题 ...

  5. python分治算法_分治法及其python实现例子

    在前面的排序算法学习中,归并排序和快速排序就是用的分治法,分治法作为三大算法之一的,有非常多的应用例子. 分治法概念 将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ...

  6. 【算法】_014_最大子数组_线性法

    1.010_maxsubarr_linear.h /*************************************************************** *版权所有 (C)2 ...

  7. 最大子数组下标java,【算法】最大子数组

    问题描述:给定一只股票在某段时间内的历史价格变化曲线,找出一个能够实现收益最大化的时间段. 理解:为找出最大化的收益,需要考虑的是在买进和卖出时的价格变化幅度,因此从该股票的每日变化幅度来考虑问题比较 ...

  8. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  9. 算法设计练习题(1)——分治法

    1. 给定一个数组A,任务是设计一个算法求得数组中的"主元素",即在数组中个数超过数组总元素个数一半的元素.但是数组中元素的数据类型可能是复杂类型,这意味着数组中的元素进能够比较是 ...

最新文章

  1. Error loading WebappClassLoader
  2. 非word格式文件700015怎么办_vim黑科技--在word/浏览器/excel等环境中使用vim
  3. Lua学习教程之 可变參数数据打包与解包
  4. UI-UIButton、UILable、UITextField总结
  5. [原创]公布读取瑞星注册码的小程序源代码
  6. 作者:牟少敏,博士,山东农业大学教授。
  7. 高等组合学笔记--完结篇
  8. KFD algorithm
  9. matlab2c使用c++实现matlab函数系列教程-weibpdf函数
  10. django动态HTML转PDF方法
  11. LitePal(版本1.5.0,写此博客时是最新版本)
  12. deeplin显示安装空间不够_太实用了!这种冷门的显示器支架可帮了大忙了
  13. 【转】艺术设计、数字媒体、环艺、影视动画、摄影、广编专业…等…视频、教程、资讯、图库、作品汇总大全
  14. 编译原理: Subset Construction 子集构造法(幂集构造)(NFA转DFA)
  15. 布谷鸟哈希函数的参数_Cuckoo Hash 布谷鸟哈希
  16. CSTC 2001 聪明的学生 BZOJ 2523 递归(类搜索,推理)
  17. 家庭用服务器的作用,家庭网络存储服务器四大主要功能
  18. 什么是uni-app?
  19. 影响无线AP终端接入数量的几大因素
  20. 1. THE REAL-TIME VOLUMETRIC CLOUDSCAPES OF HORIZON ZERO DAWN

热门文章

  1. 交通事故检测识别笔记
  2. Excel表格中如何设置页眉、页脚
  3. HOOK准备--PC版微信初试
  4. 发那科机器人新机配置
  5. 谷哥翻译,你敢随随便便相信吗?
  6. ext4magic恢复误删的目录文件测试(ext3/4)
  7. 达人篇:1)简单易懂的质量管理-写在达人篇开篇
  8. 生经益气 马尾综合征
  9. 网页3d立体照片代码
  10. SQL 判断字段值是否有中文、英文、数字、提取中文、英文、数字