数据结构和算法
文章平均质量分 74
KittyGirllll
梦想,是注定孤独的旅行
展开
-
C语言实现顺序线性表及request for member''in something not a structure or union
最近开始复习数据结构,就从线性表开始,哈哈哈!C语言实现了顺序线性表的定义、获取元素、插入元素及删除元素的操作。#include#define MAXSIZE 20typedef int ElemType;typedef struct{ ElemType data[MAXSIZE]; int length;}SqList;#define OK 1#define原创 2017-03-08 16:47:37 · 18925 阅读 · 0 评论 -
C语言实现哈希表查找算法
哈希表(散列表)是直接通过关键字key得到要查找的记录的内存存储位置。散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表或者哈希表。整个散列过程分为两步:1.在存储时,通过散列函数计算记录的散列地址,并按此地址存储该记录。2.当查找记录时原创 2017-08-18 15:39:34 · 12695 阅读 · 3 评论 -
【苦练基本功2】求最小公倍数
数学知识回顾:两个树的乘积等于这两个数的最小公倍数与最大公约数的乘积。那么求最小公倍数可以先求得最大公约数。求最大公约数的一种算法是辗转相除法,也叫做欧几里得算法。其计算原理依赖于下面的定理:定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(greatest common divisor)缩写为gcd。gcd(a,b) = gcd(b,a原创 2017-08-18 16:23:59 · 363 阅读 · 0 评论 -
C语言实现图的邻接矩阵存储结构及深度优先遍历和广度优先遍历
在Dev C++中调试运行通过。用下图进行了测试。#include #define MaxVertexNum 50 #define QueueSize 50 typedef enum{FALSE,TRUE}shifou; shifou visited[MaxVertexNum];原创 2017-07-26 15:59:37 · 17493 阅读 · 6 评论 -
C语言实现冒泡排序和简单选择排序
冒泡排序(Bubble Sort)的基本思想为两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止。其时间复杂度为O(n^2)。简单选择排序(Simple Selection Sort)的基本思想是通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换。其时间复杂度为O(n^2),但性能上还是略优于冒泡排序。以下程序在DEV C++中调原创 2017-08-21 16:00:33 · 894 阅读 · 0 评论 -
C语言实现二叉排序树的相关操作
二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树:若它的左子树不为空,则左子树上的所有结点的值均小于它的根结点的值若它的右子树不为空,则右子树上的所有结点的值均大于它的根结点的值它的左右子树也分别为二叉排序树构造二叉排序树的目的,并不是为了排序,而是为了提高查找和插入删除关键字的速度。以下程序在DEV C++中调试运原创 2017-08-14 19:28:58 · 518 阅读 · 0 评论 -
C语言实现平衡二叉树
平衡二叉树(Self-Balancing Binary Search Tree),是一种二叉排序树,其中每个结点的左子树和右子树的高度差为-1,0,1之中的某个值。二叉平衡树又称为AVL树。平衡因子BF是指二叉树上结点的左子树深度减去右子树深度的值。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。平衡二叉树构建的基本思想是在构建二叉排序树的过程中,每当插入一原创 2017-08-15 16:45:30 · 2369 阅读 · 0 评论 -
C语言实现堆排序算法
堆排序(Heap Sort)是对简单选择排序的一种改进。堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。堆排序就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆,此时整个序列的最大值就是堆顶的根结点。将它移走,然后将剩余的n-1个序列重新构造称一个堆,这原创 2017-08-25 14:36:03 · 1180 阅读 · 0 评论 -
C语言实现直接插入排序和希尔排序
直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到新的记录数增1的有序表。其时间复杂度为O(N^2)。以下程序在DEV C++中调试运行通过#include#include#includetypedef struct{ int r[10]; int lenght; }SqList;void Insert原创 2017-08-23 15:58:16 · 999 阅读 · 0 评论 -
C语言实现归并排序算法
归并排序(Merging Sort)的原理是假设初始序列含有n个记录,则可以看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或者1的子序列;再两两归并,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。以下程序在DEV C++中调试运行通过。#include#include#includetypedef struct{ in原创 2017-08-28 15:43:26 · 1314 阅读 · 0 评论 -
C语言实现快速排序算法
快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。Partition函数要做的就是先选取一个关键字,然后想尽办法将它放到一个位置,使得它左边的值都比它小,右边的值都比它大,将这样的关键字称为枢轴(pivot)。选取枢轴的方法可以是选数组的第一原创 2017-08-29 15:15:04 · 521 阅读 · 0 评论 -
七种排序算法总结
根据排序过程中借助的主要操作,将7种内排序算法按照下图所示进行分类。将7种算法的各种指标进行对比,如下表所示。从平均情况来看,显然最后3种改进算法要胜过希尔排序,并远远胜过前3种简单算法。从最好情况看,反而冒泡和直接插入排序要更胜一筹,也就是说,如果待排序列总是基本有序,反而不应该考虑四种复杂的改进算法。从最快情况看,堆排序与归并排序又强过快速排序以及其他简单排序。原创 2017-08-29 16:07:38 · 500 阅读 · 0 评论 -
C语言实现图的Prim最小生成树算法
连通图的最小代价生成树成为最小生成树。这里采用图的邻接矩阵存储结构来存储边上的权值。将图中的n个节点按0~n-1编号,最后最小生成树的输出形式是两个节点编号代表的边。以下程序在DEV C++中调试通过。/*图的邻接矩阵存储结构和Prim算法实现最小生成树*/#include #define MaxVertexNum 9 #define INFINITY 65535原创 2017-07-27 17:26:48 · 4094 阅读 · 1 评论 -
C语言实现图的Kruskal最小生成树算法
Prim算法是以某顶点为起点逐步寻找各顶点上最小权值的边来构建最小生成树的,而Kruskal算法是以边为目标去构建,因为权值在边上,直接去找最小权值的边来构建生成树。这里换了一种图的存储结构,边集数组存储结构。以下程序在DEV C++下编译运行通过。#includetypedef struct{ int begin; int end; int weight;}Edge;原创 2017-07-31 16:42:30 · 2754 阅读 · 3 评论 -
C语言实现单链表
Dev C++编译运行通过,实现了单链表的构建,清空,插入,删除和查询。#include#include#include#include#include#define OK 1#define ERROR 0typedef int ElemType;typedef struct Node{ ElemType data; struct Node *next;}Node;原创 2017-03-15 11:11:01 · 469 阅读 · 0 评论 -
C语言实现栈
栈这种数据结构是在线性表和链表上进行改造得到的。下面程序分别实现了栈的顺序存储结构和栈的链式存储结构的压栈和弹栈操作,均在DEV C++下运行通过。/*栈的顺序存储结构*/#include#include#include#include#include#define OK 1#define ERROR 0#define MAXSIZE 10typedef int SE原创 2017-04-10 20:59:22 · 321 阅读 · 0 评论 -
C语言实现队列
队列可以有两种存储结构表示,顺序存储结构和链式存储结构,以下代码在DEV C++下编译运行通过。/*循环队列的顺序存储结构*/#include#include#include#include#include#define OK 1#define ERROR 0#define MAXSIZE 10typedef int QElemType;typedef int Status原创 2017-04-11 09:25:35 · 601 阅读 · 0 评论 -
C语言实现KMP模式匹配算法
用C语言分别实现简单的模式匹配算法和KMP模式匹配算法,在DEV C++下运行通过,对于同一个模式匹配,两者的时间分别是0.01239和0.007465,简单的说明了KMP算法的高效。#include#include#include#include#include//simple index/*返回字串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0,T非空,1<=原创 2017-05-15 11:32:07 · 1109 阅读 · 0 评论 -
C语言实现二叉树的基本操作
二叉树中使用最多的方法就是递归,要能在大脑中想象出函数递归调用的过程。下面代码实现了二叉树结构体的建立,二叉树的形成,二叉树的遍历,二叉树深度和叶子节点数。在Dev C++中调试运行通过。#include #include typedef struct BiTNode{ char data; struct BiTNode *lChild; struct原创 2017-07-11 10:44:01 · 1361 阅读 · 0 评论 -
【苦练基本功1】三种方法实现约瑟夫环问题
1.约瑟夫环问题描述有n个人围城一圈,按顺序编号,从第一个人开始报数,从1报到m,凡报到m的人退出圈子,然后接着报数,问最后留下来的是原来的第几号的那位?2.数组实现用长度为n的数组存储人的编号,退出的人编号置为0,当n-1个人都退出后,剩下的那个编号不为0的人就是要找的人。#include void left_num(int* a,int n,int m) { int原创 2017-07-09 17:23:52 · 640 阅读 · 0 评论 -
C语言实现图的关键路径算法
上一篇文章的拓扑排序主要是为了解决一个工程能否顺利进行的问题,但有时我们还需要解决工程完成需要的最短时间的问题。在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网成为AOE网(Acitivity On Edge Network)。AOE网具有这样的特性,在某顶点所代表的事件发生后,从该顶点出发的各活动才能开始。只有在进原创 2017-08-08 19:11:38 · 4734 阅读 · 4 评论 -
C语言实现三种有序表查找算法
折半查找技术,又称二分查找。它的前提是线性表中的记录必须是关键码有序,线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区域继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区域继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。该算法的时间原创 2017-08-09 16:04:24 · 2265 阅读 · 0 评论 -
C语言实现有向无环图的拓扑排序算法
对AOV网进行拓扑排序的基本思路是:从AOV网中选择一个入度为0的顶点输出,然后删除此顶点,并删除以此顶点为尾的弧,继续重复此步骤,直到输出全部顶点或者在AOV网中不存在入度为0的顶点为止。这里图使用的数据结构是邻接表,并且在顶点表加入顶点入度一项。以下程序在DEV C++中编译运行通过。#include #include #define MAXVEX 20typedef st原创 2017-08-03 16:31:33 · 4367 阅读 · 0 评论 -
C语言实现图的最短路径Floyd算法
Floyd算法直接使用二维数组求出所有顶点到所有顶点的最短路径。D代表顶点到顶点的最短路径权值和的矩阵。P代表对应顶点的最小路径的前驱矩阵。以下程序在DEV C++中调试运行通过。#include #define INFINITY 65535typedef int VertexTy原创 2017-08-02 16:59:19 · 8772 阅读 · 0 评论 -
C语言实现图的最短路径Dijkstra算法
Dijkstra算法采用了动态规划的思想,是一个按照路径长度递增的次序产生最短路径的算法。其中有三个重要的数组,final[w]表示下标为w的节点是否已经求得了最短路径,值为1表示已经得到。D[w]表示下标为w的节点的最短路径权值和。P[w]表示下标为w的节点的最短路径上前驱节点的下标值。最终返回数组D,P,就可以得到v0节点到任意一个节点的最短路径序列和路径长度。这里采用的是原创 2017-08-01 16:02:57 · 9075 阅读 · 7 评论 -
深入理解Dijkstra算法
最近由于科研项目需要深入理解Dijkstra算法,发现该算法虽然之前看过两遍但还是没有彻底理解,今天来详细解析一下,并用Java实现。Dijkstra算法求解的是加权连通简单图中一个顶点到其他每个顶点的具有最小权和的有向路径。最简单版本的时间复杂度为O(n^2),是多项式时间算法。该算法是利用了一种广度优先搜索的思想,从起始点开始逐个向外扩散直到遍历完所有节点。该算法主要分为以下四步: 0...原创 2018-03-09 15:34:38 · 521 阅读 · 1 评论