
算法系列
文章平均质量分 71
对基本的算法和数据结构进行说明,并使用c语言进行了算法的实现。
TODD911
热爱计算机
展开
-
图之Dijkstra算法
Dijkstra算法是一种求单源最短路的算法,即从一个点开始到所有其他点的最短路。其步骤如下:原创 2013-07-21 14:07:56 · 12779 阅读 · 2 评论 -
C语言实现多个数的最小公倍数
#include //获得最小公倍数int doLCM(int* array,int size){ int x,y,temp,gcd=array[0],i,result=1; for(i=0;(i+1)<size;i++){ x=gcd; y=array[i+1]; //保证x>y if(x < y){ temp = y;原创 2012-09-03 10:08:09 · 14286 阅读 · 4 评论 -
求数组的全排列之字典序法
字典序法说明:字典序列算法是一种非递归算法。而它正是STL中Next_permutation的实现算法。它的整体思想是让排列成为可递推的数列,也就是说从前一状态的排列,可以推出一种新的状态,直到最终状态。比如说,最初状态是12345,最终状态是54321。1.最初状态为12345,从最后面向前面比较,因为5>4,所以从4后面的序列中找出一个比4大,但是比在4后面的序列中最小的数,因为只原创 2012-08-16 08:40:41 · 3349 阅读 · 0 评论 -
基于霍夫曼编码的任意文件压缩程序
本程序主要使用霍夫曼编码对任意文件进行压缩。程序的步骤如下:如果有一个文件大小为8个bytes。其中ascii为m的字符一共出现了n次:m n1 32 23 14 15 1以n的大小为依据构建霍夫曼树:如果将父节点通往左孩子的路径标识为0,通往右孩子的路径标识为1,则霍原创 2013-03-27 21:15:34 · 3646 阅读 · 0 评论 -
图之kruskal算法
kruskal算法是一种最小生成树算法。基本思想如下:设有一个有n个顶点的连通网N={V,E},最初先构造一个只有n个顶点,没有边的非连通图T={V, E},图中每个顶点自成一个连通分量。当在E中选到一条具有最小权值的边时,若该边的两个顶点落在不同的连通分量上,则将此边加入到T中;否则将此边舍去,重新选择一条权值最小的边。如此重复下去,直到所有顶点在同一个连通分量上为止。下面举例说明kru原创 2013-07-07 16:09:43 · 7452 阅读 · 2 评论 -
图之prim算法
最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),同时还要考虑使树的权最小。 prim算法就是一种最小生成树算法。原创 2013-07-03 22:19:59 · 10884 阅读 · 3 评论 -
图之图的深度优先遍历
深度优先遍历是连通图的一种遍历策略。其基本思想如下:设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的原创 2013-06-27 13:11:35 · 63107 阅读 · 16 评论 -
图之图的广度优先遍历
广度优先遍历是连通图的一种遍历策略。其基本思想如下:1、从图中某个顶点V0出发,并访问此顶点;2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;3、重复步骤2,直到全部顶点都被访问为止。例如下图中:1.从0开始,首先找到0的关联顶点3,42.由3出发,找到1,2;由4出发,找原创 2013-06-26 21:37:50 · 27634 阅读 · 3 评论 -
图之图的存储
关于图的基本概念,这边就不再写了。下面来说下图的存储,存储图可以使用邻接矩阵和邻接表。所谓邻接矩阵就是使用一个矩阵来存储图,下图使用矩阵来存储有向图和无向图。进行简单地说明,图G5中,V0和到V1有连线,所以坐标为(0,1)的地方为1,又因为G5是无向图,所以坐标为(1,0)的地方也为0,最后我们看到G5的存储矩阵是对角线对称的。图G6中,V4到V3有连线,所以坐标为(原创 2013-06-25 21:58:19 · 1917 阅读 · 0 评论 -
排序之bitmap排序
所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个原创 2013-01-06 12:44:34 · 6616 阅读 · 7 评论 -
查找之二叉树查找
1. 查找树的创建(createTree)假设有如下数组4,1,45,78,345,23,12,3,6,21首先选定4为root,然后遍历剩下的数字,如果大于等于4则放到4的右侧,小于4放到4的左侧,最后构建成的树:所有的左孩子都小于父节点,所有的右孩子都大于等于父节点。如下图:2. 遍历查找树(displayTree)按照左中右的顺序遍原创 2013-01-06 09:43:56 · 24977 阅读 · 6 评论 -
查找之折半查找
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以原创 2012-12-28 11:12:16 · 1491 阅读 · 0 评论 -
查找之顺序查找
所谓顺序查找,就是将数组遍历一遍,一个一个对比,如果相同就算找到了,比较简单。C语言代码实现如下:#include void display(int array[],int size){ printf("the array is:"); int i; for(i=0;i<size;i++){ p原创 2012-12-28 10:24:16 · 1026 阅读 · 0 评论 -
排序之归并操作
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。 如 设有数列{6,202,100,301,38,8,1} 初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数 i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3 i=2 [ 6 100 2原创 2012-12-26 15:19:26 · 1789 阅读 · 0 评论 -
排序之希尔排序
希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2c语言的实现如下:#include //打印数组void d原创 2012-12-26 13:46:09 · 1023 阅读 · 0 评论 -
排序之直接插入排序
直接插入排序(straight insertion sort)的作法是: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。具体步骤如下:初始序列: i=1 [46] 58 15 45 90 18 10 62 ↓ i=2 [46 58] 15 45 90 18 10 62 ┌——┘ ↓ i=3 [15 46 58]原创 2012-12-26 12:48:57 · 1190 阅读 · 0 评论 -
排序之堆排序
堆排序是是指利用堆这种数据结构所设计的一种排序算法。c语言的实现如下:#include #define SIZE 10//打印数组void display(int array[],int size){ printf("the array is:"); int i; for(i=0;i<size;i++){原创 2012-12-21 15:54:57 · 1060 阅读 · 0 评论 -
排序之直接选择排序
直接选择排序(Straight Select Sorting) 也是一种简单的排序方法,它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R{1}~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n原创 2012-12-21 11:10:26 · 7232 阅读 · 0 评论 -
排序之快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。c语言实现如下:#include //打印数组原创 2012-12-21 10:28:14 · 1286 阅读 · 0 评论 -
排序之冒泡排序
冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),原创 2012-12-20 09:33:05 · 3516 阅读 · 5 评论