![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
开在初夏-命名忧伤
cs在读研究僧
展开
-
求最大的连续子列和
#include <iostream>using namespace std;/* 给定N个整数的序列{ A1, A2, …, AN}求连续的子列的最大值 有四种方式实现*///算法一int MaxSubseqSum1 (int A[], int N);//算法二int MaxSubseqSum2 (int A[], int N);//算法三 分治法...原创 2018-05-04 10:59:12 · 217 阅读 · 0 评论 -
二叉树的建立、插入、删除、遍历(前中后的递归及非递归遍历和层次遍历)、求树高及叶子结点等
主要难点为树的建立和,非递归遍历,尤其是后序的非递归遍历。1.非递归遍历的主要思路:从根结点开始,沿左子树深入下去,当深入到最左端时,无法深入下去,则返回刚才深入的时遇到的结点,并遍历该结点的右子树,进行如此的深入和返回,直到最后根结点的右子树返回到跟结点为止。2.这一过程中,返回结点的顺序和进入结点的顺序相反,即先进入后返回,正好符合堆栈因此采用堆栈这一数据结构。在沿左子树进行深入时...原创 2018-08-07 21:00:55 · 459 阅读 · 0 评论 -
二叉排序树(搜索树)的建立、插入、查找、删除
本程序的主要难点在于,二叉排序树的删除。删除的结点有三种情况:1.要删除的是叶结点。这种情况最简单,可以直接删除,然后再修改其父结点的指针置空即可。2.如果要删除的结点只有一个孩子结点(该结点不一定是叶结点,可以是子树的根),删除之前需要改变父结点的指针,指向要删除结点的孩子结点。3.如果要删除的结点有左右两棵子树,有两种选择:一、取其右子树中的最小元素。 二、取其左子树中的最大元素。...原创 2018-08-08 21:04:11 · 458 阅读 · 0 评论 -
图的存储结构—-邻接矩阵和邻接表的代码实现
图的存储结构一般有两种:一、邻接矩阵:用矩阵表示图中各顶点之间的邻接关系和权值。(一般把带权值的图叫做网)邻接矩阵适合稠密图的存储。二、邻接表:是图的一种顺序存储于链式存储结合的存储方法。领接表表示法类似于树的孩子链表表示法。就是对于图G中的每个顶点Vi,将所有的邻接于Vi的顶点Vj链接成一个单链表,这个单链表就称做顶点Vi的邻接表,再将所有点的邻接表表头放到一个数组中,就构成了图的邻接表...原创 2018-08-20 10:25:02 · 1978 阅读 · 0 评论 -
单源最短路径-迪杰斯塔拉(Dijkstra)算法的实现
/************************************************************************** 文件名:7.1.1.cpp** 文件描述:Dijkstra算法的实现(好久没写代码了,看来我还是适合codeing不适合paper)** 创建人: fdk* 时 间: 2018-09-03** 版本号:1.0** 修...原创 2018-09-04 19:57:45 · 259 阅读 · 0 评论 -
弗洛伊德(Floyd)算法(多源最短路径)
弗洛伊德算法比较适合稠密图,形式上比较优雅,核心代码只有五行。for (k = 1; k <= g.v; k++) for (i = 1; i <= g.v; i++) for(j = 1; j <= g.v; j++) if (g.matrix[i][j] > g.matrix[i][k] + ...原创 2018-09-08 16:06:09 · 490 阅读 · 0 评论 -
拓扑排序
概述:在现实生活中,某些事物可以用有向无环图(Directed Acyclic Graph,DAG)表述。这种有向无环图通常也称作“流程图”,比如,施工流程图、生产流程图、图中每个顶点可以代表一个具体的工序,每条有向边则反映了两个工序的前后次序。拓扑序:如果图中从V到W有一条有向路径,则V一定排在W之前。满足此条件的顶点序列称为一个拓扑序。获得一个拓扑序的过程就是拓扑排序AOV如果...原创 2018-09-17 08:35:35 · 457 阅读 · 4 评论 -
最小生成树之Prim算法-使用邻接矩阵实现
最小生成树的算法,网上有详细的介绍,这里简单谈一下关键的几个步骤:1:prim算法和单源最短路径中的迪杰斯特拉算法很相识,也在其中借鉴了部分算法。总的来说将图上的顶点分成两部分。一部分 为树顶点(已被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点)。首先选择任意一个顶点加入生成树,然后从剩 下的非树顶点中选择一个距离生成树最近的顶点加入到生成树中,并且更新其它非...原创 2018-09-13 15:28:20 · 2041 阅读 · 0 评论 -
最小生成树之克鲁斯卡尔算法(Kruskal)
prim算法中的最小生成树是,采用的是从一个顶点开始,让一棵小树逐渐长成最小生成树,而kruskal算法,采用的是每次选择权值最小的一条边作为生成树,采用将每一棵生成树合并一棵最小生成树方法。也就是将树合成为森林。有一点需要注意:就是将新边加入到最小生成树中时,要判断是否构成回路,如果构成回路的话,则不能加入。那么问题来了,如何判断构成回路呢?一种是采用深度优先搜索来判断两个顶点是否连通,另一种是...原创 2018-09-14 17:32:49 · 442 阅读 · 0 评论 -
排序之桶排序
如果已知N个关键字的取值范围在0到M-1之间,而M比N小的多,则桶排序则为关键字的每个可能取值建立一个桶,即建立M个桶;在扫描N个关键字时,将每个关键字放入到相应的桶中,然后按照桶的顺序收集一遍就自然有序了。所以桶排序的效率比一般的排序算法效率高-------当然需要的额外条件是已知关键字的范围,并且关键字在此范围内是可列的,个数还不能超过内存空间所能承受的程度。代码如下:/******...原创 2018-09-26 15:32:36 · 145 阅读 · 0 评论 -
排序算法之基数排序
基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。对于一般的基数排序有通常有两种排序算法:主位优先算法(Most Significant Digit...原创 2018-09-26 15:42:47 · 160 阅读 · 0 评论 -
二分查找算法
这个在之前的九大算法中已经写过了,这次重新又写了一遍是为了进一步加深理解并学习--树这一存储结构/************************************************************************** 文件名:3.1.1.cpp** 文件描述:二分查找算法** 创建人: fdk* 时 间: 2018-08-02** 版本...原创 2018-08-02 20:06:53 · 242 阅读 · 0 评论 -
平衡二叉树(AVL树)的插入、删除
AVL树主要难点在于,插入和删除,因为插入和删除后需要对树进行调整使其仍满足AVL树的要求,具体的调整过程网上都有就不细讲了,主要是删除部分很少有书进行讲解,可以参考一下:http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html我的删除部分代码:可以看看为什么在删除一个结点后采用这种调整方式,博主也是看了好久才明白,一定要...原创 2018-08-11 10:33:27 · 221 阅读 · 0 评论 -
哈夫曼树的创建
哈夫曼树每次选取两个最小值,然后将两个最小值之和再存入到权值中,如果用数组每次都排序插入在排序,效率不高,本文采用最小堆的形式,堆中的元素为带权值的哈夫曼结点。代码如下:/************************************************************************** 文件名:5.2.1.cpp** 文件描述:哈夫曼树** ...原创 2018-08-14 10:26:24 · 3042 阅读 · 0 评论 -
9大排序算法
/***文件名:1.1.7.cpp**文件描述:该list使用下面的排序算法进行排序:* 直接插入排序、希尔排序、简单选择排序、* 堆排序、冒泡排序、快速排序、归并排序、* 奇偶排序、臭皮匠排序**创建人:fdk**时间:2018-7-14**版本号:1.1**修改记录:我用list写不出来,采用的是数组。*...原创 2018-07-17 15:16:09 · 276 阅读 · 0 评论 -
线性表(顺序表)的查找、新增、和删除
/************************************************************************** 文件名:2.1.1.cpp** 文件描述:使用线性表的顺序表来实现初始化、查找、插入、删除** 创建人: fdk* 时 间: 2018-07-28** 版本号:1.0** 修改记录:***************...原创 2018-07-28 17:03:05 · 696 阅读 · 0 评论 -
线性表(链表)的创建、查找、插入、删除
/************************************************************************** 文件名:2.1.2.cpp** 文件描述:线性表(链表)的查找、插入、删除** 创建人: fdk* 时 间: 2018-07-28** 版本号:1.0** 修改记录:头结点的作用:1、防止单链表是空的而设的.当链表...原创 2018-07-30 15:12:03 · 788 阅读 · 0 评论 -
栈的顺序存储实现-简单的进栈及出栈
/************************************************************************** 文件名:2.2.1.cpp** 文件描述:栈的顺序存储实现** 创建人: fdk* 时 间: 2018-07-30** 版本号:1.0** 修改记录:*******************************...原创 2018-07-30 20:37:10 · 919 阅读 · 0 评论 -
请用一个数组实现两个堆栈,要求最大地利用数组空间,使数组只要有空间入栈操作就可以成功
/************************************************************************** 文件名:2.2.2.cpp** 文件描述:请用一个数组实现两个堆栈,要求最大地利用数组空间,使数组只要有空间入栈操作就可以成功** 创建人: fdk* 时 间: 2018-07-30** 版本号:1.0** 修改记录...原创 2018-07-31 10:37:43 · 572 阅读 · 0 评论 -
堆栈的链式存储实现(简单的入栈和出栈)
/************************************************************************** 文件名:2.2.3.cpp** 文件描述:堆栈的链式存储实现** 创建人: fdk* 时 间: 2018-07-31** 版本号:1.0** 修改记录:******************************...原创 2018-07-31 16:04:00 · 1746 阅读 · 0 评论 -
循环队列的顺序存储实现(创建、插入、删除)
/************************************************************************** 文件名:2.2.4.cpp** 文件描述:循环队列的顺序存储实现(创建、插入、删除)** 创建人: fdk* 时 间: 2018-07-31** 版本号:1.0** 修改记录:******************...原创 2018-07-31 20:55:54 · 2475 阅读 · 0 评论 -
队列的链式存储实现(简单的入队和出队操作)
/************************************************************************** 文件名:2.2.5.cpp** 文件描述:队列的链式存储实现** 创建人: fdk* 时 间: 2018-07-31** 版本号:1.0** 修改记录:队列和堆栈一样也能采取链式存储,但队列的头fronts必须...原创 2018-08-01 13:55:18 · 2695 阅读 · 0 评论 -
单链表来实现多项式的加法和乘法运算
/************************************************************************** 文件名:2.2.6.cpp** 文件描述:实现多项式的加法及乘法运算** 创建人: fdk* 时 间: 2018-08-01** 版本号:1.0** 修改记录:链表的使用还不够熟练,不能自己独立完成需要多加练习*...原创 2018-08-01 20:15:38 · 954 阅读 · 0 评论 -
堆的建立、插入、删除以及堆排序
堆的结构为完全二叉树,因此适合用数组来存储,本文建立的是最小堆代码如下:/************************************************************************** 文件名:5.1.1.cpp** 文件描述:堆的建立、插入、删除以及堆排序** 创建人: fdk* 时 间: 2018-08-11** 版本号...原创 2018-08-14 10:22:16 · 541 阅读 · 0 评论 -
部分背包问题(贪心算法)
部分背包问题是基于贪心法的基本思想。何谓贪心法,只要你够贪心,就能领略贪心算法之精髓。部分背包问题和0/1背包问题的区别就是:部分背包问题中的单个物品,可以取一部分装入背包。而0/1背包问题则是要么全部拿走,要么一无所有(这里引用了LOL卡牌大师的台词)。 那么作为一个so greed的你,肯定应该知道按照什么顺序拿物品的把。没错,看着值钱的先抢! 这里所说的值钱,指的是单位重量所产生的价...原创 2018-11-09 20:59:23 · 5323 阅读 · 0 评论