【算法】_014_最大子数组_线性法
2014-10-01 23:49
211 查看
1、010_maxsubarr_linear.h
2、010_maxsubarr_linear.c
/*************************************************************** *版权所有 (C)2014,长沙铁信交通科技有限公司。 * *文件名称:010_maxsubarr_linear.h *内容摘要:分治法求取最大子数组 *其它说明: *当前版本:V1.0 *作 者:伍定湘 *完成日期:2014年9月27日 * *修改记录1: * 修改日期:2014年9月27日 * 版本号:V1.0 * 修改人:伍定湘 * 修改内容:创建 ***************************************************************/ #ifndef _MAXSUBARR_LINEAR_H_ //防止头文件被重复引用 #define _MAXSUBARR_LINEAR_H_ /************************************************************** 头文件引用 **************************************************************/ #include "typedef.h"//引入内置类型重定义 /************************************************************** 相关宏定义 **************************************************************/ /************************************************************** 相关结构体定义 **************************************************************/ #ifndef _MAXSUBARR_TYPEDEF_ //防止头结构体重定义 #define _MAXSUBARR_TYPEDEF_ typedef struct { INT32 iOffsetMaxBegin; INT32 iOffsetMaxEnd; INT32 iSumMax; }MaxSubArrTypedef; #endif /************************************************************** 本程序中出现的函数的声明 **************************************************************/ void maxsubarr_linear(const INT32 aTarget[], const INT32 iArrLen); #endif
2、010_maxsubarr_linear.c
/*************************************************************** *版权所有 (C)2014,长沙铁信交通科技有限公司。 * *文件名称:010_maxsubarr_linear.c *内容摘要:线性时间扩展法求取最大子数组 *其它说明:核心内容是拓展部分最大子数组必然包含元素A[j+1] *当前版本:V1.0 *作 者:伍定湘 *完成日期:2014年9月27日 * *修改记录1: * 修改日期:2014年9月27日 * 版本号:V1.0 * 修改人:伍定湘 * 修改内容:创建 ***************************************************************/ /************************************************************** 头文件引用 **************************************************************/ #include "typedef.h"//引入内置类型重定义 #include "010_maxsubarr_linear.h" #include <stdio.h> /************************************************************** 全局变量定义 **************************************************************/ /************************************************************** 函数实现 **************************************************************/ /********************************************************************** *功能描述:扩展法求取最大子数组 *输入参数:aTarget - 目标数组 * iArrLen - 目标数组的长度 *输出参数: *返回值: *其它说明: *修改日期 版本号 修改人 修改内容 * --------------------------------------------------------------------- *2014年9月27日 V1.0 伍定湘 创建 ***********************************************************************/ void maxsubarr_linear(const INT32 aTarget[], const INT32 iArrLen) { /* 初始化的变量 */ MaxSubArrTypedef msaMax = { 0, 0, aTarget[0] };//表示A[1..j]的最大子数组 INT32 iOffsetHgih = 1; /* 未初始化的变量,从循环中提出以兼容C89标准 */ INT32 iOffset; INT32 iSum; MaxSubArrTypedef msaMaxExpand;//表示A[1..j+1]除msaMax以外的最大子数组 for (; iOffsetHgih < iArrLen; iOffsetHgih++) { msaMaxExpand.iSumMax = aTarget[iOffsetHgih]; msaMaxExpand.iOffsetMaxBegin = iOffsetHgih; msaMaxExpand.iOffsetMaxEnd = iOffsetHgih; iSum = 0; /* 求A[1..j+1]除msaMax以外的最大子数组 */ for (iOffset = iOffsetHgih; iOffset >= msaMax.iOffsetMaxBegin; iOffset--) { iSum += aTarget[iOffset];//iSum的值记得及时清0 if (iSum > msaMaxExpand.iSumMax)//iSumMax和iOffsetMaxBegin都要更新 { /* 由于始终包含下标为j+1的元素 iOffsetMaxEnd不需要更新*/ msaMaxExpand.iSumMax = iSum; msaMaxExpand.iOffsetMaxBegin = iOffset; } } /* 取较大者作A[1..j+1]的最大子数组 */ msaMax = msaMaxExpand.iSumMax > msaMax.iSumMax ? msaMaxExpand : msaMax; } printf("iSumMax = %d\n", msaMax.iSumMax); printf("iOffsetMaxBegin = %d\n", msaMax.iOffsetMaxBegin); printf("iOffsetMaxEnd = %d\n", msaMax.iOffsetMaxEnd); }
相关文章推荐
- 算法导论第四章:最大子数组—递归,暴力和线性算法
- 练习4.1-5最大子数组线性算法及证明
- 算法导论4.1-3~4.1-5最大子数组暴力算法和递归算法的实现和线性时间算法实现
- 算法导论 4.1-5 最大子数组问题 线性时间算法 C++简单实现
- 求数组子数组和的最大值 (线性算法)
- 最大子数组问题---线性时间算法(转)
- 线性算法解决数组最大和
- 【软件工程】代码复审与子数组最大和线性算法寻找问题
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- 【软件工程】代码复审与子数组最大和线性算法寻找问题
- [算法题] 求数组的子数组之和的最大值
- [动态规划]最大连续子数组和的四种算法
- [算法题] 求数组的子数组之和的最大值
- [算法题] 求数组的子数组之和的最大值
- 数组中子序列最大和算法
- 【算法】寻找K个最大的数组
- 三种算法求解一个数组的子数组最大和
- 算法讨论(二)---求子数组的最大和
- 算法--将数组分成和相等的多个子数组,求子数组的最大个数
- 大学时候想的一个算法——计算数组中最大和序列