求一个数组的最大子数组(C/C++实现)

  最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组。编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++。

  其实这是个半成品,还有些BUG在里面,不过总体的思路是这样的,求最大的子数组,由一个中位分开,就是数组的中间位置,然后分别求中间位置横跨的,左边的,和右边的最大的,然后比较三者的大小,最大的为最大子数组。思路来自算法导论。今天算是把伪代码都实现了,但是貌似有点BUG,不知道有大神帮我提一下不?为了节约时间,我索性把一些问题的解释放过来,是算法导论的,我也是看的这本书做的。

求一个数组的最大子数组(C/C++实现)_第1张图片

求一个数组的最大子数组(C/C++实现)_第2张图片

 

求一个数组的最大子数组(C/C++实现)_第3张图片

求一个数组的最大子数组(C/C++实现)_第4张图片

 

  本人声明,这次是我自己写的代码,下面的,我没有看别人写的,主要还是想锻炼下自己,结合上面的算法导论看基本上就没什么问题了,晚安。

// ConsoleApplication8.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
#include 
#include 

using namespace std;
template 

int getArrayLen(T& array) //使用模板定义一个函数getArrayLen,该函数将返回数组array的长度

{

	return (sizeof(array) / sizeof(array[0]));

}

int _tmain(int argc, _TCHAR* argv[])
{
	void findMaxSubArray(int [],int);

	int a[]={5,-100,34535,32,10,5,4,-100,2}; //初始化数组
	int len=getArrayLen(a);
	findMaxSubArray(a,len);
	system("pause");


	return 0;
}



void findMaxSubArray(int a[],int len)
{
	//声明
	int getSubArraysPreIterator(int [],int ,int,int );
	int getSubArrayMid(int ,int ,int ,int [],int );

	//低位下标
	int low=0;
	//高位下标
	int high=0;
	//中间位数
	int mid=0;

	//最大子数组
	int sum=0; //第一种情况下
	int sumAfter=0; //第二种情况下
	int sumMid=0; //第三种情况下
	int mid_RightPos=0; //横跨中间数组的右边界
	int mid_LeftPos=0; //横跨中间的数组的左边界

	int sumMidFromRight=0; //从右边开始计算

	int arrLen=len;//数组长度
	
	//如果数组中只有一个元素
	if(arrLen==1)
	{
		cout<<" 最大子数组是:"<=0;i--)
	{
		sum=sum+a[i];
		int sum_=getSubArraysPreIterator(a,mid,i,0);
		if(sumsumAfter)
	{
		if(sum>sumMid)
		{
			cout<<"最终结果:"<sumAfter)
			{
				cout<<"最终结果:"<=i+1;k--)
		{
			sum+=a[k];
		}
		return sum;
	
	}

	//右边
	 if(flag ==1)
	{
		for(int k=mid+1;ki;k--)
			 {
				sum+=a[k];
			 }
			return sum;	
		
		}

	 

}

  

 

你可能感兴趣的:(求一个数组的最大子数组(C/C++实现))