数据结构与算法代码(浙大版本陈越、何钦铭老师mooc课程)

第一章:基本概念

给定N个整数的序列{A1,A2,...,AN},求最大的子列和 。

算法一:暴力法找出所有子列和,时间复杂度O(N^3)

#include<stdio.h>
#include<string.h>
int maxnum(int A[], int n);

int main() {
	int A[10] = { 1,2,3,4,-3,4,-9,4,7 };
	int n = 10;
	int p;
	p=maxnum(A, n);
	printf("%d", p);
    return 0;
}

//最大子列和的暴力求解方法

int maxnum(int A[], int n) {
	int i, j, k;
	int thisnum;
	int maxnum=0;
	for (i = 0;i < n;i++) {      /*i是子列的左端*/
		for (j = i;j < n;j++) {  /*j是子列的右端*/
			thisnum = 0;         /*A[i]到A[j]的子列和*/
			for (k = i;k <= j;k++)
				thisnum += A[k];
			if (thisnum > maxnum)
				maxnum = thisnum;
		}
	}
	return maxnum;

}

算法二:暴力法基础上提升,时间复杂度O(N^2)

//此处省略的代码在上面

int maxnum(int A[], int n) {
	int i, j, k;
	int thisnum;
	int maxnum=0;
	for (i = 0;i < n;i++) {      /*i是子列的左端*/
		thisnum = 0;
		for (j = i;j < n;j++) {  /*j是子列的右端*/
			thisnum += A[j];     /*对于相同的i,不同的j,只需要在前一次的基础上加下一个元素*/
			if (thisnum > maxnum) {
				maxnum = thisnum;
			}
		}
	}
	return maxnum;

}

当出现时间复杂度为O(N^2)的时候,程序员就会思考将时间复杂度减小到O(NlogN)

算法3:分而治之,时间复杂度O(NlogN),将复杂的问题分开解决最后合并,时间复杂度的计算方法可以由递推得到

#include<stdio.h>
#include<string.h>
int max3(int a, int b, int c);
int maxnum(int A[], int n);
int maxfenzhi(int A[], int n);
int main() {
	int A[10] = { 1,2,3,4,-3,4,-9,4,7 };
	int n = 10;
	int p;
	p=maxfenzhi(A, n);
	printf("%d", p);
    return 0;

}
int max3(int a, int b, int c) {
	return a > b ? a > c ? a : c : b > c ? b : c;
	/*这个式子是简略形式,(a > b ? (a > c ? a : c ): (b > c ? b : c))*/
}
int divideandconquer(int List[], int left, int right) {
	int maxleft, maxright;  /*存放左右子列的和*/
	int maxleftborder, maxrightborder; /*存放跨界的结果*/
	int leftborder, rightborder;
	int center, i;
	if (left == right) {
		/*递归的终止条件,此时子列只有一个数字*/
		if (List[left] > 0)
			return List[left];
		else 
			return 0;
	}
	/*分而治之中的‘分’*/
	center = (left + right) / 2; /*找到中分点*/
	/*递归求两边子列的最大和*/
	maxleft = divideandconquer(List, left, center);
	maxright = divideandconquer(List, center+1, right);
	/*下面求跨分界线的最大子列和*/
	maxleftborder = 0;
	leftborder = 0;
	for (i = center;i >= left;i--) {
		/*从中线向左侧扫描*/
		leftborder += List[i];
		if (leftborder > maxleftborder)
			maxleftborder = leftborder;
	}/*左侧扫描结束*/
	maxrightborder = 0;
	rightborder = 0;
	for (i = center + 1;i <=right;i++) {
		/*从中线向右侧扫描*/
		leftborder += List[i];
		if (leftborder > maxleftborder)
			maxleftborder = leftborder;
	}/*右侧扫描结束*/
	/*下面是分而治之中的‘治’*/
	return max3(maxleft, maxright, maxleftborder + maxrightborder);
}
int maxfenzhi(int A[], int n) {
	return divideandconquer(A, 0, n - 1);
}

算法4:在线处理算法,时间复杂度为O(N),比上面的都要快!想一下这也是最快的算法了,因为处理这种问题必须要全部看一遍数据,当然越快的算法有时候看起来不那么好理解。

#include<stdio.h>
#include<string.h>
int maxzaixian(int A[], int n);
int main() {
	int A[10] = { 1,2,3,4,-3,4,-9,4,7 };
	int n = 10;
	int p;
	p=maxzaixian(A, n);
	printf("%d", p);
	return 0;
}
int maxzaixian(int A[], int n) {
	int maxnum = 0;
	int thisnum = 0;
	for (int i = 0;i < n;i++)
	{
		thisnum += A[i];
		if (thisnum > maxnum) {
			maxnum = thisnum;
		}
		if (thisnum < 0)
		{
			thisnum = 0;
		}
	}
	return maxnum;
}

第一章的算法就是这样了,陆续会继续出以后的章节以及补充练习等等。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
内容如下: ├─程序例子 │ │ Gauss.cpp │ │ MOVE.C │ │ RUIYUE_3.C │ │ RUIYUE_4.C │ │ │ ├─1概述 │ │ bb_sort.cpp │ │ ex1-9.cpp │ │ ex1-91.cpp │ │ │ ├─2线性表 │ │ ex2-11.cpp │ │ ex2-11new.cpp │ │ linklist.cpp │ │ linklist.h │ │ LINKQUEU.C │ │ linkqueue.cpp │ │ linkqueue.h │ │ list.c │ │ LIST2.C │ │ LIST_S15.C │ │ LIST_SL.C │ │ LIST_SQ.C │ │ LIST_SQ5.C │ │ new2-11.cpp │ │ old2-11.cpp │ │ SQLIST.C │ │ Sqlist.cpp │ │ UNION.CPP │ │ │ ├─3堆栈与队列 │ │ bank_simulation.cpp │ │ conversion.cpp │ │ DMXSTACK.C │ │ hanoi.cpp │ │ MAZE.CPP │ │ QUEUE09.C │ │ SQQUEUE.C │ │ Sqqueue.cpp │ │ sqstack.cpp │ │ stack.c │ │ STK_9.C │ │ 表达式求值.cpp │ │ │ ├─5数组 │ │ array.c │ │ array_ex.cpp │ │ array_test.cpp │ │ DK1.c │ │ DK2.c │ │ SANYANZU.C │ │ │ └─6树 │ bitree.cpp │ BITREE11.C │ bitree2.cpp │ BITREE23.C │ BITREE9.C │ Create_bitree.c │ inorder_thr_tree.cpp │ intreading.cpp │ TING6.C │ TRAVERSE.C │ └─课件 sjjg答疑.txt 数据结构1概述.ppt 数据结构2线性表1.ppt 数据结构3线性表2.ppt 数据结构4堆栈与队列1.ppt 数据结构5堆栈与队列2.ppt 数据结构6串.ppt 数据结构7数组1.ppt 数据结构8数组2.ppt 数据结构9树1.ppt 数据结构A树2.ppt 数据结构B树3.ppt 数据结构C图1.ppt 数据结构D图2.ppt 数据结构E查找.ppt 数据结构F排序.ppt 数据结构文稿14.ppt
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值