数据结构(C语言)
文章平均质量分 61
bfhonor
没有天生的高手,更没有永远的菜鸟。
展开
-
堆排序算法实现及其效率和稳定性分析(C语言)
一、堆排序(一)什么是“堆(Heap)”?若n个关键字序列L[1…n] 满⾜下面某⼀条性质,则称为堆(Heap):① 若满足:L(i)≥L(2i)且L(i)≥L(2i+1) (1 ≤ i ≤n/2 )—— 大根堆(大顶堆)② 若满足:L(i)≤L(2i)且L(i)≤L(2i+1) (1 ≤ i ≤n/2 )—— 小根堆(小顶堆)(二)建立大根堆(二)建立大根堆(代码实现)(四)基于大根堆进行排序堆排序:每一趟将堆顶元素加入有序子序列(与待排序序列中的最后一个原创 2021-08-18 14:03:37 · 1115 阅读 · 0 评论 -
冒泡排序(BubbleSort)算法以及简单选择排序(SelectSort)算法实现(C语言)
一、冒泡排序从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。称这样过程为“一趟”冒泡排序。(二)算法实现//交换void swap(int &a, int &b){ int temp = a; a = b; b = temp;}//冒泡排序void BubbleSort(int A[], int n){ for(int i=0 ; i<n-1 ; i++){ bool flag = f原创 2021-08-18 14:00:47 · 568 阅读 · 0 评论 -
希尔Shell Sort排序算法实现机器性能分析(C语言)
一、 希尔排序(Shell Sort)希尔排序:先追求表中元素部分有序,再逐渐逼近全局有序希尔排序:先将待排序表分割成若干形如 L[i, i + d, i + 2d,…, i + kd] 的“特殊”子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止。(一)希尔排序1. 增量d=4的希尔排序希尔排序,第一趟:希尔排序,第二趟:希尔排序,第三趟:希尔排序整体步骤:2. 增量d=4的希尔排序(二)算法实现原创 2021-08-18 13:58:34 · 386 阅读 · 0 评论 -
排序算法概念以及插入排序算法实现(C语言)
一、排序算法概念(一)什么是排序?排序(Sort),就是重新排列表中的元素,使表中的元素满足按关键字有序的过程。(二)排序算法的评价指标算法的稳定性。若待排序表中有两个元素Ri和Rj,其对应的关键字相同即keyi = keyj,且在排序前Ri在Rj的前⾯,若使⽤某⼀排序算法排序后,Ri仍然在Rj的前⾯,则称这个排序算法是稳定的,否则称排序算法是不稳定的。(三)排序算法的分类内部排序:数据都在内存中【关注如何使用算法时,空间复杂度更低】外部排序:数据太多,无法全部放入内存【还要关注如原创 2021-08-18 13:53:55 · 379 阅读 · 0 评论 -
散列表的开放定址法以及再散列法(C语言)
一)处理冲突的方法——开放定址法所谓开放定址法,是指可存放新表项的空闲地址既向它的同义词表项开放,又向它的非同义词表项开放。其数学递推公式为:在这里插入图片描述1. 线性探测法(1)插入操作注意:采用“开放定址法”时,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填入散列表的同义词结点的查找路径,可以做一个“删除标记”,进行逻辑删除线性探测法很容易造成同义词、非同义词的“聚集(堆积)”现象,严重影响查找效率产生原因——冲突后再探测一定是放在某个连续的位置原创 2021-08-11 21:17:34 · 2716 阅读 · 0 评论 -
散列表的概念及其拉链法和常见的散列函数(C语言)
一、散列查找(一)散列表(Hash Table)散列表(Hash Table),又称哈希表。是⼀种数据结构,特点是:数据元素的关键字与其存储地址直接相关若不同的关键字通过散列函数映射到同⼀个值,则称它们为“同义词”通过散列函数确定的位置已经存放了其他元素,则称这种情况为“冲突”(二)处理冲突的方法——拉链法用拉链法(又称链接法、链地址法)处理“冲突”:把所有“同义词”存储在一个链表中原创 2021-08-11 21:14:44 · 3033 阅读 · 1 评论 -
B+树概念和查找操作以及与B树的优缺对比(C语言)
一、 B+树特点:块内无序、块间有序一棵m阶的B+树需满足下列条件:①、每个分支结点最多有m棵子树(孩子结点)。②、非叶根结点至少有两棵子树,其他每个分支结点至少有⌈m/2⌉棵子树。③、结点的子树个数与关键字个数相等。④、所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小顺序排列,并且相邻叶结点按大小顺序相互链接起来。【⽀持顺序查找】⑤、所有分支结点中仅包含它的各个子结点中关键字的最大值及指向其子结点的指针。可以理解为:要追求“绝对平衡”,即所有子树高度要相同②、原创 2021-08-11 10:14:45 · 466 阅读 · 0 评论 -
B树的相关概念及其插入、删除操作(C语言)
eg:对于5叉排序树,规定除了根节点外,任何结点都至少有3个分叉,2个关键字若每个结点内关键字太少,导致树变高,要查更多层结点,效率低策略1:m叉查找树中,规定除了根节点外,任何结点⾄少有⌈m/2⌉个分叉,即至少含有⌈m/2⌉ − 1 个关键字策略2:m叉查找树中,规定对于任何一个结点,其所有子树的高度都要相同。对于同时满足策略1和策略2的树,称其为B树。原创 2021-08-10 21:42:30 · 779 阅读 · 0 评论 -
分块查找的思及其查找效率分析(C语言)
分块查找,又称索引顺序查找,算法过程如下:①在索引表中确定待查记录所属的分块(可顺序、可折半)②在块内顺序查找1. 用折半查找查索引原因:最终low左边一定小于目标关键字,high右边一定大于目标关键字。而分块存储的索引表中保存的是各个分块的最大关键字若索引表中不包含⽬标关键字,则折半查找索引表最终停在 low>high,要在low所指分块中查找原创 2021-08-09 15:22:59 · 1347 阅读 · 0 评论 -
折半查找的算法思想、实现及其判定树的查找和构造(C语言)
一、折半查找(一)算法思想折半查找,又称“二分查找”,仅适用于有序的顺序表2. 折半查找判定树的构造如果当前low和high之间有奇数个元素,则 mid 分隔后,左右两部分元素个数相等如果当前low和high之间有偶数个元素,则 mid 分隔后,左半部分比右半部分少一个元素mid = ⌊(low + high)/2⌋折半查找的判定树一定是平衡二叉树折半查找的判定树中,只有最下面一层是不满的。因此,元素个数为n时树高h = ⌈log2(n + 1)⌉原创 2021-08-09 11:27:37 · 6897 阅读 · 1 评论 -
查找的基本概念及其顺序查找思想和实现(C语言)
一、查找基本概念(一)基本概念查找 —— 在数据集合中寻找满⾜某种条件的数据元素的过程称为查找查找表(查找结构)—— ⽤于查找的数据集合称为查找表,它由同⼀类型的数据元素(或记录)组成关键字 —— 数据元素中唯⼀标识该元素的某个数据项的值,使⽤基于关键字的查找,查找结果应该是唯⼀的。(二)对查找表的常⻅操作...原创 2021-08-09 11:18:17 · 512 阅读 · 0 评论 -
关键路径AOE网及其如何求关键路径步骤(C语言)
一、关键路径(一)AOE网在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如完成活动所需的时间),称之为⽤边表示活动的网络,简称AOE网 (Activity On Edge NetWork)在这里插入图片描述AOE⽹具有以下两个性质:① 只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始;② 只有在进入某顶点的各有向边所代表的活动都已结束时,该顶点所代表的事件才能发⽣。另外,有些活动是可以并行进行的原创 2021-08-07 16:50:42 · 7807 阅读 · 7 评论 -
逆拓扑排序实现思想以及通过DFS算法实现逆拓扑排序(C语言)
(一)逆拓扑排序对一个AOV网,如果采用下列步骤进行排序,则称之为逆拓扑排序:① 从AOV网中选择一个没有后继(出度为0)的顶点并输出。② 从网中删除该顶点和所有以它为终点的有向边。③ 重复①和②直到当前的AOV网为空。原创 2021-08-07 16:03:25 · 5930 阅读 · 3 评论 -
拓扑排序之AOV网及其拓扑排序思想(C语言)
一、拓扑排序(一)AOV⽹AOV网(Activity On Vertex NetWork,⽤顶点表示活动的网):用DAG图(有向无环图)表示⼀个⼯程。顶点表示活动,有向边<Vi, Vj>表示活动Vi必须先于活动Vj进行在这里插入图片描述(二)拓扑排序拓扑排序:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的⼀个拓扑排序:① 每个顶点出现且只出现⼀次。② 若顶点A在序列中排在顶点B的前⾯,则在图中不存在从顶点B到顶点A的路径。或定义为:拓扑排序是对有向无环图的顶点原创 2021-08-07 15:48:14 · 2471 阅读 · 0 评论 -
有向无环图描述表达式(C语言)
一、有向无环图描述表达式(一)有向无环图(DAG)有向无环图:若⼀个有向图中不存在环,则称为有向无环图,简称DAG图(Directed Acyclic Graph)(二)DAG描述表达式29.【2019统考真题】用有向无环图描述表达式(x+y)((x +y)/x),需要的顶点个数至少是( )。A、5B、6C、8D、9顶点中不可能出现重复的操作数(三)解题方法原创 2021-08-07 10:59:09 · 3153 阅读 · 0 评论 -
最短路径问题之Floyd算法(C语言)
一、单源最短路径(一)Floyd算法(带权图、无权图)Floyd算法:求出每⼀对顶点之间的最短路径使⽤动态规划思想,将问题的求解分为多个阶段对于n个顶点的图G,求任意⼀对顶点 Vi —> Vj 之间的最短路径可分为如下⼏个阶段:#初始:不允许在其他顶点中转,最短路径是?#0:若允许在 V0 中转,最短路径是?#1:若允许在 V0、V1 中转,最短路径是?#2:若允许在 V0、V1、V2 中转,最短路径是?…#n-1:若允许在 V0、V1、V2 …… Vn-1 中转,最短路径是?原创 2021-08-07 10:14:45 · 3971 阅读 · 0 评论 -
最短路径问题之Dijkstra算法(C语言)
一、单源最短路径(一)Dijkstra算法(带权图、无权图)1. BFS算法的局限性带权路径⻓度——当图是带权图时,⼀条路径上所有边的权值之和,称为该路径的带权路径⻓度BFS算法求单源最短路径只适用于无权图,或所有边的权值都相同的图2. Dijkstra算法初始:从V0开始,初始化三个数组信息如下????第1轮:循环遍历所有结点,找到还没确定最短路径,且dist 最⼩的顶点Vi,令final[i]=ture。第2轮:循环遍历所有结点,找到还没确定最短路径,且dist 最⼩的顶原创 2021-08-07 09:42:40 · 3070 阅读 · 0 评论 -
最短路径问题之广度优先算法BFS(C语言)
一、单源最短路径(一)最短路径问题“G港”是个物流集散中⼼,经常需要往各个城市运东⻄,怎么运送距离最近?——单源最短路径问题各个城市之间也需要互相往来,相互之间怎么⾛距离最近?——每对顶点间的最短路径(二)最短路径BFS算法(无权图)//求顶点u到其他顶点的最短路径void BFS_MIN_Distance(Graph G, int u){ //d[i]表示从u到i结点的最短路径 for(i=0; i<G.vexnum; i++){ d[i]=∞; //初始化路径长度原创 2021-08-07 09:36:53 · 4046 阅读 · 0 评论 -
最小生成树的Prim算法以及Kruskal算法(C语言)
一、生成树连通图的生成树是包含图中全部顶点的一个极小连通子图。边尽可能的少,但要保持连通若图中顶点数为n,则它的生成树含有 n-1 条边。对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。(一)最小生成树(最小代价树)对于⼀个带权连通⽆向图G = (V, E),⽣成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。设R为G的所有⽣成树的集合,若T为R中边的权值之和最⼩的⽣成树,则T称为G的最⼩⽣成树(Minimum-Spanning-Tree,MST)原创 2021-08-06 21:15:14 · 1230 阅读 · 0 评论 -
图的广度优先遍历BFS(C语言)
一、图的广度优先遍历BFS(一)树 vs 图⼴度优先遍历(Breadth-First-Search, BFS)要点:①、找到与⼀个顶点相邻的所有顶点②、标记哪些顶点被访问过③、需要⼀个辅助队列FirstNeighbor(G,x):求图G中顶点x的第⼀个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1。NextNeighbor(G,x,y):假设图G中顶点y是顶点x的⼀个邻接点,返回除y之外顶点x的下⼀个邻接点的顶点号,若y是x的最后⼀个邻接点,则返回-1。bool原创 2021-08-04 22:05:52 · 3229 阅读 · 1 评论 -
图的深度优先遍历DFS(C语言)
一、图的深度优先遍历DFS(一)图的深度优先遍历bool visited[MAX_VERTEX_NUM]; //访问标记数组,????初始值为falsevoid DFS(Graph G, int v){ //从顶点v出发,深度优先遍历图G visit(v); //访问顶点v visited[v]=TRUE; //设已访问标记 for(w=FirstNeighbor(G,v); w>=0; w=NextNeighor(G,v,w)){ if(!visited[w]){ //w为u的尚未访原创 2021-08-04 20:34:59 · 1929 阅读 · 0 评论 -
图的存储邻接矩阵、邻接表、十字链表以及邻接多重表相关方法(C语言)
一、图的存储(一)邻接矩阵(数组实现的顺序存储,空间复杂度高,不适合存储稀疏图)#define MaxVertexNum 100 //顶点数目的最大值typedef struct{ char Vex[MaxVertexNum]; //顶点表,顶点中可以存更复杂的信息。 int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表;可以用bool型或枚举型变量表示边。 int vexnum,arcnum; //图的当前顶点数和边数/弧数}MGraph;原创 2021-08-04 19:56:19 · 1447 阅读 · 2 评论 -
图的基本概念以及特殊形态的图(C语言)
一、图的基本概念(一)图的定义图G由顶点集V和边集E组成,记为G = (V, E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。若V = {v1, v2, … , vn},则用|V|表示图G中顶点的个数,也称图G的阶,E = {(u, v) | uÎ∈V, v∈V},用|E|表示图G中边的条数。注意:线性表可以是空表,树可以是空树,但图不可以是空,即V一定是非空集(二)无向图、有向图若E是无向边(简称边)的有限集合时,则图G为无向图。边是顶点的原创 2021-07-31 21:51:12 · 787 阅读 · 0 评论 -
哈夫曼树定义及其构造和编码(C语言)
一、哈夫曼树(一)带权路径长度结点的权:有某种现实含义的数值(如:表示结点的重要性等)结点的带权路径长度:从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积树的带权路径长度:树中所有叶结点的带权路径长度之和(WPL, Weighted Path Length)(二)哈夫曼树的定义(三)哈夫曼树的构造(四)哈夫曼编码原创 2021-07-29 10:08:33 · 1399 阅读 · 0 评论 -
平衡二叉树AVL树定义、插入以及调整最小不平衡子树(C语言)
一、平衡二叉树定义平衡二叉树(Balanced Binary Tree),简称平衡树(AVL树)——树上任一结点的左子树和右子树的高度之差不超过1。结点的平衡因子=左子树高-右子树高。//平衡二叉树结点typedef struct AVLNode{ int key; //数据域 int banlance;//平衡因子 struct AVLNode *lchild,*rchild;}AVLNode,*AVLTree;二、平衡二叉树的插入在二叉排序树中插入新的结点后,如何保持平衡?原创 2021-07-29 10:07:19 · 2476 阅读 · 0 评论 -
二叉排序树BST的定义及其增删改查操作(C语言)
一、二叉排序树BST(一)二叉排序树的定义二叉排序树可用于元素的有序组织、搜索.二叉排序树,又称二叉查找树(BST,Binary Search Tree)先搜索找到目标结点:① 若被删除结点z是叶结点,则直接删除,不会破坏二叉排序树的性质。② 若结点z只有一棵左子树或右子树,则让z的子树成为z父结点的子树,替代z的位置。③ 若结点z有左、右两棵子树,则令z的直接后继替代z,然后从二叉排序树中删去这个直接后继,这样就转换成了第一种情况。原创 2021-07-28 18:08:33 · 636 阅读 · 0 评论 -
树的存储结构以及树和森林的遍历(C语言)
一、树的存储结构(一)双亲表示法(顺序存储)双亲表示法:每个结点中保存指向双亲的“指针;方案一:只需要parent双亲位置域设置成-1即可。方案二:将最下的面的元素替换掉要删除的元素即可。原创 2021-07-28 15:24:49 · 1972 阅读 · 2 评论 -
在线索二叉树中找前驱和后继(C语言)
一、线索二叉树找前驱和后继(一)中序线索二叉树1. 中序线索二叉树找中序后继//找到以P为根的子树中,第一个被中序遍历的结点ThreadNode *Firstnode(ThreadNode *p){ //循环找到最左下结点(不一定是叶结点) while(p-> == 0) p=p->lchild; return p;}//在中序线索二叉树中找到结点p的后继结点ThreadNode *Nextnode(ThreadNode *p){ //右子树最左下结点 if(p->原创 2021-07-28 11:59:27 · 5033 阅读 · 9 评论 -
线索二叉树的存储结构及其作用(C语言)
一、 线索二叉树(一)线索二叉树的作用能否从一个指定结点开始中序遍历?思路:从根节点出发,重新进行一次中序遍历,指针q记录当前访问的结点,指针 pre 记录上一个被访问的结点①当q == p时,pre为前驱②当pre == p时,q为后继缺点:找前驱、后继很不方便;遍历操作必须从根节点开始。//中序遍历void InOrder(BiTree T){ if(T != NULL){ InOrder(T -> lchild); //递归遍历左子树 visit(T); /原创 2021-07-28 11:57:47 · 1462 阅读 · 2 评论 -
由遍历序列构造二叉树(C语言)
一、不同的二叉树遍历序列(一)、不同二叉树的中序遍历序列中序遍历:中序遍历左子树、根结点、中序遍历右子树(二)不同二叉树的前序遍历序列前序遍历:根结点、前序遍历左子树、前序遍历右子树<hr/><img src='https://img-blog.csdnimg.cn/20210708193617832.png'>原创 2021-07-08 20:15:23 · 2894 阅读 · 3 评论 -
二叉树的前、中、后遍历以及层序遍历操作(C语言)
遍历:按照某种次序把所有结点都访问一遍。要么是个空二叉树,要么就是由“根节点+左子树+右子树”组成的二叉树<img src='https://img-blog.csdnimg.cn/20210708095703684.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MDk2Njcw,size_16,color_FFFFFF,t_70'>原创 2021-07-08 19:23:23 · 927 阅读 · 0 评论 -
二叉树的定义、常见的性质及其存储结构(C语言)
一、二叉树的定义与基本术语(一)基本概念二叉树是n(n≥0)个结点的有限集合:① 或者为空二叉树,即n = 0。② 或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。特点:①每个结点至多只有两棵子树 ②左右子树不能颠倒(二叉树是有序树)【注意区别:度为2的有序树】1. 二叉树的五种状态(二)几种特殊的二叉树1. 满二叉树 && 完全二叉树2. 二叉排序树一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树:①、原创 2021-07-08 18:51:17 · 4108 阅读 · 0 评论 -
树的定义、基本术语以及常考性质(C语言)
∅ 空树——结点数为0的树非空树的特性:①、有且仅有一个根节点②、没有后继的结点称为“叶子结点”(或终端结点)③、有后继的结点称为“分支结点”(或非终端结点)④、除了根节点外,任何一个结点都有且仅有一个前驱⑤、每个结点可以有0个或多个后继。除了根节点外,任何一个结点都有且仅有一个前驱树是n(n≥0)个结点的有限集合,n = 0时,称为空树,这是一种特殊情况。在任意一棵非空树中应满足:①、有且仅有一个特定的称为根的结点。②、当n > 1时,其余结点可分为m(m > 0)原创 2021-07-07 10:20:56 · 855 阅读 · 2 评论 -
字符串之KMP算法求解next数组(C语言)
next数组的作⽤:当模式串的第j个字符失配时,从模式串的第next[j]的继续往后匹配。①、任何模式串都一样,第一个字符不匹配时,只能匹配下一个子串,<font color='red'>next[1]都无脑写0</font>②、任何模式串都一样,第2个字符不匹配时,应尝试匹配模式串的第1个字符,<font color='red'>next[1]都无脑写1</font><hr/><img src='https://img-blog.csdnimg.cn/20210613152508423.gif'>原创 2021-06-13 16:34:28 · 1992 阅读 · 2 评论 -
字符串之KMP算法(C语言)
<img src='https://img-blog.csdnimg.cn/20210613124704784.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MDk2Njcw,size_16,color_FFFFFF,t_70'>原创 2021-06-13 12:37:16 · 1540 阅读 · 12 评论 -
朴素模式匹配算法(C语言)
- 字符串模式匹配:在主串中找到与模式串相同的子串,并返回其所在位置。- <font color='red'>注意:①、子串——主串的一部分,一定存在。②、模式串——不一定能在主串中找到</font>- 主串长度为n,模式串长度为m。- 朴素模式匹配算法:将主串中<font color='red'>所有长度为m的子串</font>依次与模式串匹配对比,直到找到一个完全匹配的子串,或所有的子串都不匹配为止。- ==最多对比n-m+1个子串==原创 2021-06-02 17:52:57 · 5298 阅读 · 7 评论 -
字符串的定义及其存储结构(C语言)
<img src='https://img-blog.csdnimg.cn/20210530114614200.png'>一、定义(“逻辑结构”)(一)串的定义串,即字符串(String)是由零个或多个字符组成的有限序列。一般记为S = ‘a1a2······an’ (n ≥0)其中,S是串名,单引号括起来的字符序列是串的值;ai可以是字母、数字或其他字符;串中字符的个数n称为串的长度。n = 0时的串称为空串(用∅表示)。原创 2021-05-31 21:38:45 · 2222 阅读 · 3 评论 -
特殊矩阵的压缩存储(C语言)
一、一维数组的存储结构各数组元素大小相同,且物理上连续存放。数组元素a[i] 的存放地址 = LOC + i * sizeof(ElemType) (0≤i<10)注:除非题目特别说明,否则数组下标默认从0开始<hr/><img src='https://img-blog.csdnimg.cn/20210515195529809.png#pic_center'>原创 2021-05-30 11:15:54 · 1565 阅读 · 2 评论 -
栈在表达式求值中的应用(C语言)
<img src='https://img-blog.csdnimg.cn/20210513203309369.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MDk2Njcw,size_16,color_FFFFFF,t_70'>原创 2021-05-13 21:08:54 · 923 阅读 · 2 评论 -
队列(Queue)的链式存储结构以及双端队列的相关概念(C语言)
<img src='https://img-blog.csdnimg.cn/20210512144134581.gif#pic_center'><img src='https://img-blog.csdnimg.cn/2021051215244128.png'>原创 2021-05-12 15:20:35 · 563 阅读 · 1 评论