Implementation codes of Data Structures and Algorithm Analysis in C (1)

CHAPTER 1

P23 Maximum Subsequence Problem

#include<iostream>
#include<windows.h>
#include<ctime>
#include<stdio.h>
using namespace std;


class MaxSubsequenceSum
{
public:
	MaxSubsequenceSum(int *Array, int Left1, int Right1):A(Array), Left(Left1), Right(Right1)
	{
		outcome = 0;
	}

	int maxx(int a = 0, int b = 0, int c = 0)
	{
		int temp = a>b?a:b;
		return (temp>c?temp:c);
	}

	int MaxSubsequenceSum1()
	{
		int ThisSum, MaxSum, i, j, k;
		MaxSum = 0;
		for (i = Left; i <= Right; i++)
		{
			for (j = i; j <= Right; j++)
			{
				ThisSum = 0;
				for (k = i; k <= j; k++)
					ThisSum += A[k];
				if (ThisSum > MaxSum)
					MaxSum = ThisSum;
			}
		}
		return MaxSum;
	}

	int MaxSubsequenceSum2()
	{
		int ThisSum, MaxSum, i, j;
		MaxSum = 0;
		for (i = Left; i <= Right; i++)
		{
			ThisSum = 0;
			for (j = i; j <= Right; j++)
			{
				ThisSum += A[j];
				if (ThisSum > MaxSum)
					MaxSum = ThisSum;
			}
		}
		return MaxSum;
	}

	int MaxMub3(int A[], int Left, int Right, int middle)
	{
		int max1 = A[middle];
		int count = 0;
		for (int i=middle; i>=Left; i--)
		{
			count += A[i];
			if (count > max1)
				max1 = count;
		}
		int max2 = A[middle];
		count = 0;
		for (int i = middle; i<=Right; i++)
		{
			count += A[i];
			if (count > max2)
				max2 = count;
		}
		return (max1+max2-A[middle]);
	}

	int MaxSub3(int Array[], int Left1, int Right1)
	{
		int middle = int ((Left1+Right1)/2);
		int subleft, subright, submiddle;
		if (Left1==Right1)
			return Array[Left1];
		if (Left1==Right1-1)
			return Array[Right1];
		subleft = MaxSub3(Array, Left1, middle);
		subright = MaxSub3(Array, middle, Right1);
		submiddle = MaxMub3(Array, Left1, Right1, int((Left1+Right1)/2));
		return maxx(subleft, subright, submiddle);
	}

	int MaxSubsequenceSum3()
	{
		return MaxSub3(A, Left, Right);
	}

	int MaxSubsequenceSum4()
	{
		int ThisSum, MaxSum, j;
		ThisSum = MaxSum = 0;
		for (j = Left; j<=Right; j++)
		{
			ThisSum += A[j];
			if (ThisSum > MaxSum)
				MaxSum = ThisSum;
			else if(ThisSum < 0)
				ThisSum = 0;
		}
		return MaxSum;
	}

	int MaxSubsuquenceSum(int x)
	{
		switch(x)
		{
		case 1:
			{
				outcome = MaxSubsequenceSum1();
				printf("Algorithm 1\nOutcome: %d\nTime Complexity: O(n^3)\n", outcome);
				break;
			}
		case 2:
			{
				outcome = MaxSubsequenceSum2();
				printf("Algorithm 2\nOutcome: %d\nTime Complexity: O(n^2)\n", outcome);
				break;
			}
		case 3:
			{
				outcome = MaxSubsequenceSum3();
				printf("Algorithm 3\nOutcome: %d\nTime Complexity: O(n*logn)\n", outcome);
				break;
			}
		case 4:
			{
				outcome = MaxSubsequenceSum4();
				printf("Algorithm 4\nOutcome: %d\nTime Complexity: O(n)\n", outcome);
				break;
			}
		default:
			{
				cout<<"Input Error!"<<endl;
				return -1;
			}
		}
	}

private:
	int *A;
	int Left;
	int Right;
	int outcome;


};

void main()
{
	time_t start,end,time;
	const int N = 30;
	int Array[30] = {-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,3,4,5,6,7,-1,-1,-1,-1,-111,-1,-1};
	start=clock();
	MaxSubsequenceSum a(Array, 0, N-1);
	a.MaxSubsuquenceSum(1);
	end=clock();
	time=end-start;
	long ti = time;
	printf("Running time:%d ms\n\n", ti);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值