
算法导论(C语言实现)
alike_meng
好菜啊,怎么办
展开
-
聚集操作二进制计数器递增1
#include "stdafx.h"#include<stdio.h>void increase(int a[],int n){ int time = 1,k,j; for (time = 1; time <= 16; time++) //输出加16次的过程 { int i = 0; while...原创 2018-09-16 17:56:54 · 713 阅读 · 0 评论 -
插入排序的递归和非递归方法
1.递归 2.非递归原创 2018-07-26 19:14:03 · 1850 阅读 · 0 评论 -
B树完整实现(附详细注释)
一定要结合图形和书来看,注释是根据算法导论写的,有些太绕了,直接上书看好得多。可以结合具体例子看,根据例子来理解代码要轻松一些代码是抄的这个博主的(B树我自己写不出来…),有少许改动,原博文除了没有注释之外,分析写的还是很好的,主要是代码结构很简洁,大概也是按照导论来的。https://blog.youkuaiyun.com/geek_jerome/article/details/78895289看以...原创 2018-10-11 22:58:38 · 434 阅读 · 0 评论 -
斐波那契堆
基本上是按照算法导论写的。结果还是运行不出来,然后参照了这个博主(非常推荐这个博主,写了很多算法导论的博客用C写的):https://www.cnblogs.com/skywang12345/p/3659060.html说下要注意的地方吧,看完书之后纯敲代码都搞了接近两天才弄出来,还是看了别人的写的,哭晕了都…从上到下:struct _heap的结构我开始是没有用maxDegree的,感...原创 2018-10-28 17:18:53 · 1107 阅读 · 0 评论 -
二项堆
参考算法导论以及这个博主的代码:https://blog.youkuaiyun.com/chenhanzhun/article/details/21443555完整C语言实现如下#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#define MAX 0x3f3f3f3f //表示正无穷typedef in...原创 2018-10-21 19:29:45 · 483 阅读 · 0 评论 -
无向图邻接链表的广度优先搜索
个人认为图的算法看起来非常简洁,但是实现起来需要基础很扎实。因为经常会涉及多种简单的数据结构,怎样把他们恰当的串联起来,不会报那种,空指针了,类型不匹配,实体类型不符合了等等。在做无向图邻接链表广度优先搜索的时候,写的很冒火,想去找别的博主的代码借鉴一下,发现大部分,真的是大部分,都是有问题的,有些甚至都运行不出来。于是硬着头皮自己写了。第一步是分析:无向图里面用到的数据结构一个是链表,这里...原创 2018-11-04 11:52:09 · 1010 阅读 · 0 评论 -
有向图邻接矩阵深度优先搜索
上一个文章是写的无向图和邻接链表的广度搜索,深度搜索就用矩阵和有向图了。矩阵处理起来还是会比链表简单一些。先分析数据结构:1.储存所有结点的集合用到了一个单向循环链表,为什么要用循环链表呢,因为在存储结点数据的时候是按照输入数据的顺序来储存的,如果是用一个数组或者单向链表,我们可以得到数组或链表第一个元素作为源节点的遍历,但是我要是指定数组中的第三个元素作为源节点呢。这样就不太好操作了,所以...原创 2018-11-04 18:34:29 · 2411 阅读 · 0 评论 -
kruskal最小生成树
参考了这位博主的文章:https://blog.youkuaiyun.com/Strive_Y/article/details/81660719kruskal最小生成树主要思想就是用贪心策略每次加最小权重的边到最小生成树里面,同时保证不要形成环路。以下代码花了一般的篇幅实现判断不相交集合,也就是判断某条边是否可以加入到生成树里面,上一张导论上的图,说明一下数据结构。下面用到了一个C语言库函数里面的 q...原创 2018-11-11 23:38:09 · 314 阅读 · 0 评论 -
Floyd-Warshall 所有结点对的最短路径算法
以下代码仅支持结点是顺序的,比如输入5个结点,结点的编号只能是1到5,输入顺序可以不一致。动态规划真的简洁,三个 for 把这么复杂的东西就整理好了。递推公式:**d[i][j] = min ( d[i][j] , d[i][k] + d[k][j] ) **动态规划重点在于递归式:不要看字,看这个图!!!就很容易理解下面那个递归式了维护了两个矩阵,一个权重的矩阵(做计算)和一个前驱...原创 2018-11-18 20:18:00 · 522 阅读 · 0 评论 -
Prim最小生成树
Prim最小生成树是一个动态的过程,并不是一次性把所有结点的最小的key都算出来然后一个一个往最小生成树里面加,而是先选定一个结点,让他最小成为第一个加进去,以此为基础开始循环,更新key的值,每次都加入当前最小的并且没有被加入的,每一次循环都在更新,直到把所有的都加进去。代码几乎是抄的,因为我没有写出来…修改了一些,加了些注释,让输出清楚完整一些,改的有点不像C++了…修改前的源码是...原创 2018-11-16 16:21:17 · 659 阅读 · 0 评论 -
Bellman-Ford单源最短路径
Bellman-Ford算法主要思想就是一个松弛在有向图中,在寻找的过程中找到的是只能是当前的最小权重,但是当路径向后推移的时候,可能就会有更小的权重出现了,那就换一条路(变化parent)给他松弛一下,得到更小的路径。最后那个布尔值是在检查是否存在一个可从源节点到达的权重为负值的环路,存在那么这个图就没有解,否则就有解。图是这样的,依旧是把字母按字母表的顺序转换成数字了。代码在图算法...原创 2018-11-18 11:23:07 · 472 阅读 · 0 评论 -
二分法查找已排序数组的中元素的递归和非递归方法
1.递归 2.非递归原创 2018-07-26 21:06:28 · 677 阅读 · 0 评论 -
二叉查找树的创建,查找,插入,删除等操作C语言
#include&amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;#include&amp;amp;amp;lt;stdlib.h&amp;amp;amp;gt;typedef int type;typedef struct bst //创建结构体{ type data;原创 2018-08-30 17:28:25 · 1565 阅读 · 0 评论 -
赫夫曼编码
代码来自博主https://blog.youkuaiyun.com/sinat_28826891/article/details/79802739 自己添加了一些更详细注释。#include "stdafx.h"#define MAXSIZE 50#include&lt;string.h&gt;#include&lt;stdio.h&gt;typedef struct{ char...原创 2018-09-12 21:19:54 · 1746 阅读 · 0 评论 -
最小堆实现最小优先队列
最小优先队列的可以实现的操作: insert,插入一个元素 min,找到最小的元素 extract-min,去掉最小的元素并返回最小的元素 increase-key,增加一个关键字的值优先队列的形式是一个堆。也就是有parent,left,right和自身的值的形式。实现他的操作是依赖于堆的操作,比如要插入一个key,实际上就是在堆中去找key的位置,然后维护堆。所以要时刻清醒的是现在...原创 2018-09-12 12:48:20 · 3866 阅读 · 0 评论 -
01背包问题动态规划
主要是写出递归的公式和判断输出的条件。#include &quot;stdafx.h&quot;#include&amp;lt;stdio.h&amp;gt;#define number 4#define wmax 8int vm[number+1][wmax+1] = {0}; //一张4+1*8+1的表vm,代表当包里有i件商品,用了j的容量时得到的价值int v[number...原创 2018-09-10 21:17:33 · 527 阅读 · 0 评论 -
贪心算法区间图着色问题
问题来自算法导论十六章,使用尽可能少的教室对一系列活动进行调度。 思路,把能兼容的活动放在以一个教室。 先把所有活动按结束时间递增的顺序排列,方便以后的循环。选取快速排序,期望时间复杂度为nlgn,最坏为n^2.快排我都有点忘记了,但是看了一下算法导论的图就秒懂了,可见学算法结合图形还是很重要的事情。 循环活动,把每个活动往教室里填,看活动是否与教室里已有的活动兼容(也就是开始时间是否比最后...原创 2018-09-10 17:56:47 · 6573 阅读 · 0 评论 -
贪心算法活动选择问题(递归&&迭代)
#include &amp;quot;stdafx.h&amp;quot;#include&amp;amp;lt;stdio.h&amp;amp;gt;#define n 11int s[n + 1] = { -1,1,3,0,5,3,5,6,8,8,2,12 }; //活动按结束的时间递增排列int f[n + 1] = { 0,4,5,原创 2018-09-09 15:02:07 · 1668 阅读 · 0 评论 -
动态规划最优二叉搜索树
前面的optimal-bst还能写出来,要去construct就不会了,也是理解不够深刻的原因吧。以下代码的construct用了两种方法,参照了两位博主,前一个代码风格非常暴力,能看懂以后写不出来系列。第二种的d的输出那我没有看出逻辑,好像是用的输出的相邻两个下标是在同一个节点上连着?这个的理由我没想出来(我也不确定该博主代码是否正确,但输出是对的)。 参照 https://blog.csdn...原创 2018-09-08 21:12:38 · 2526 阅读 · 0 评论 -
动态规划最长公共子序列(C语言)
#include &quot;stdafx.h&quot;#include&amp;lt;stdio.h&amp;gt;#define m 7#define n 6int c[m + 1][n + 1];int b[m+1][n+1];void LCS_LENGTH(char *x,char *y){ int i,j; for (i = 0; i &amp;lt;= m; i++)原创 2018-09-08 12:59:43 · 3426 阅读 · 0 评论 -
矩阵链乘法最优解
#include &amp;quot;stdafx.h&amp;quot;#include&amp;amp;lt;stdio.h&amp;amp;gt;#define r1 3#define r2 2#define c1 2#define c2 3#define n 6int m[n+1][n+1];int s[n+1][n+1];//计算矩阵的值void matrix_matiply(int a[][2], int b[原创 2018-09-07 17:44:38 · 987 阅读 · 0 评论 -
动态规划装配线调度工厂最快路线
#include &quot;stdafx.h&quot;#include&amp;lt;stdio.h&amp;gt;int l1[7] = { -1,-1,0,0,0,0,0 };int l2[7] = { -1,-1,0,0,0,0,0 }; //选择哪一条int f1[7] = { -1,0,0,0,0,0,0 }; int f...原创 2018-09-06 23:32:38 · 420 阅读 · 0 评论 -
顺序统计量树的检索元素和秩递归和迭代方法完整代码(C语言)
递归检索元素os_select node* os_select(tree &amp;amp;t, int i) //返回第i小的结点,递归{ node *x = t; int r = x-&amp;gt;left-&amp;gt;size + 1; if (i == r) return x; else...原创 2018-09-05 19:49:38 · 501 阅读 · 0 评论 -
红黑树的构建以及插入和删除操作(C语言完整)
参照算法导论伪代码。 注释没有很详细,建议先看算法导论或者其他博主的分析搞清楚insert和delete操作的方法。#include&amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;gt;#include&amp;amp;amp;amp;amp;lt;stdlib.h&amp;amp;amp;amp;amp;gt;typedef int type;typedef enum Col原创 2018-09-04 09:31:08 · 1640 阅读 · 1 评论 -
Dijkstra单源最短路径
Disktra 看上去就像是prim和bellman_ford结合的算法。同样是采取松弛的方法,不同的是bellman按顺序把边遍历了逐渐调整,而Diskstra是按邻接的结点(和prime算法里面是一样的)来遍历松弛的。有选择的去遍历边,代码的效率有所提高。如果用斐波那契堆实现最小优先队列去extract-min的话,运行时间能到O(VlgV+E)#include "stdafx.h"#...原创 2018-11-18 15:25:07 · 229 阅读 · 0 评论