第一章:基本概念

给定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;
}

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

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

  1. 数据结构-第一讲 基本概念-学习笔记(MOOC 浙江大学 陈越 何钦铭)

    目录 第一讲 基本概念 1.1 什么是数据结构 1.1.1 关于数据组织 - 例:图书摆放 1.1.2 关于空间使用 - 例:PrintN函数实现 1.1.3 关于算法效率 - 例:计算多项式值 计算 ...

  2. 数据结构与算法--代码鲁棒性案例分析

    代码鲁棒性 鲁棒是robust的音译,就是健壮性.指程序能够判断输入是否符合规范,对不合要求的输入能够给出合理的结果. 容错性是鲁棒的一个重要体现.不鲁棒的代码发生异常的时候,会出现不可预测的异常,或 ...

  3. 数据结构与算法--代码完整性案例分析

    确保代码完整性 在撸业务代码时候,经常面对的是接口的设计,在设计之初,我们必然要先想好入参,之后自然会有参数的校验过程,此时我们需要把可能的输入都想清楚,从而避免在程序中出现各种纰漏.但是难免面面俱到 ...

  4. 4数据结构与算法(C/C++实现)视频教程-王桂林-专题视频课程

    <4>数据结构与算法(C/C++实现)视频教程-1008人已学习 课程介绍         C/C++实现数据结构与算法视频培训课程全面介绍计算机行业,基本的数据结构与算法,既有理论的深度 ...

  5. 考研数据结构与算法代码实现目录

    文章目录 线性表与链表 栈和队列 三.树与二叉树 四.图 五.查找 六.排序 8.2 插入排序 8.3 交换排序 8.4 选择排序 8.5 归并排序 一定要从本质上彻底搞懂数据结构,在代码层面上理解. ...

  6. 《数据结构与算法》第二版-陈卫卫-陆军工程大学811数据结构教材 第1-2章 参考答案

    <数据结构与算法>(第二版)陈卫卫-高等教育出版社     陆军工程大学811数据结构教材    第1-2章 参考答案 习题1.1 1.1-1      (1)名称.数量.特征.性质的   ...

  7. MOOC浙江大学陈月、何钦铭老师《数据结构》学习笔记01

    ①多项式求和的两种方法. double f(int n, double a[], double x) { int i;double p = a[0];for ( i=1; i<=n; i++)p ...

  8. 冒泡算法代码java_java版本的冒泡算法

    /** 文件名:MAOPao.java 描述: java版本的冒泡算法 作者:慈勤强 Email:cqq1978@Gmail.com **/ http://www.gaodaima.com/?p=42 ...

  9. 哦麦艾斯!AI设计的丑衣服将引领时尚?数据结构与算法代码面试题;将文件藏在图片里的隐写工具;蒙古语语音合成语料库

最新文章

  1. 【iCore组合式双核心开发板教程】【快速使用手册】
  2. 将本地镜像发布到阿里云
  3. 把你的 VS Code 打造成 C++ 开发利器
  4. 博客园客户端(睡睡版iphone)源码
  5. Windows Phone性能优化建议
  6. Linux中断(interrupt)子系统之一:中断系统基本原理
  7. PyTorch 1.0 中文官方教程:使用PyTorch进行深度学习
  8. 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入
  9. 邪恶的编码魔咒,你中招没?
  10. vue循环渲染本地图片不显示?
  11. VBA 打开 Debug窗口 进行调试 (同时可以查看debug操作对应的快捷键)
  12. pku 3207 Ikki's Story IV - Panda's Trick 2-sat判定是否存在可行解
  13. 《Python CookBook2》 第一章 文本 - 测试一个对象是否是类字符串 字符串对齐
  14. Python-Matplotlib 7 饼状图
  15. 在linux上運行小火車
  16. 【GNN框架系列】DGL第一讲:使用Deep Graph Library实现GNN进行节点分类
  17. Unity3D做的DEMO
  18. BIOS锁定纯UEFI启动的解锁办法
  19. ESP32 文件存储 spiffs
  20. 解锁万亿级市场,边缘计算不“边缘”

热门文章

  1. ​用友T+标准版如何反结账,反记账​
  2. Python笔记 | 四平方数和定理
  3. Ipad手写笔什么牌子好用?高性价比ipad手写笔排行
  4. mysql8最大连接数设置
  5. axure内联框架和动态面板_Axure教程:如何使用动态面板?动态面板功能详解
  6. shell获取文件夹下所有文件名
  7. 最短作业优先(SJF)调度算法
  8. Unity3D 大型游戏 最后一站 源码 部分重点匹配战斗(一)(10)
  9. 组复制系统变量 | 全方位认识 MySQL 8.0 Group Replication
  10. 解决:centos中不能打拼音输汉字