C
文章平均质量分 57
C语言数据结构与算法
灵魂工程师.
We are all Dream-Builders.
展开
-
基数排序
分配类排序不需要比较关键字的大小,它通过关键字中各位的值,通过对序列进行若干次分配和收集来实现的,分配类排序是一种借助于多关键字排序的思想对单关键字排序的方法,基数排序是典型的分配类排序基数排序多关键字的排序方法有最高位优先法和最低位优先法,基数排序一般利用最低位优先法,从低位到高位,对各位数上的数字进行比较从而不断调整序列元素顺序,基数排序是桶排的进阶。void RadixSort(int a[],int n)//基数排序{ int base=1,max=a[0]; for(int原创 2021-04-20 19:26:44 · 338 阅读 · 0 评论 -
归并排序
归并排序的基本思想:将两个或两个以上的有序表合并成一个有序表,将两个有序表合并成一个有序表的过程称为 2-路归并归并排序将含有n个关键字的序列看成是n个有序的子序列,然后两两归并,如此重复,直到得到一个长度为n的有序序列为止。...原创 2021-04-20 16:36:56 · 104 阅读 · 0 评论 -
选择排序
选择排序的基本思想:每一趟从待排序的序列中选出关键字最小的记录,按顺序放在已排序的序列最后,直到整个序列排完为止。一、简单选择排序简单选择排序又称直接选择排序 ,每一趟从该关键字之后寻找最小值,然后放在当前已排序的序列最后。void SSelectSort(int a[],int n)//简单插入排序{ int i,j,l,min; for(i=0;i<n;i++) { min=INF;//INF值为0x3f3f3f3f表示无穷大 for原创 2021-04-18 22:22:51 · 171 阅读 · 0 评论 -
交换排序
交换排序的基本思想:两两比较待排序的关键字,当失序时则进行交换,直到整个序列满足要求为止。一、 冒泡排序两两比较关键字,若失序则进行交换,使得关键字较小的记录如同气泡逐渐往上漂浮,而关键字较大的则像石头一样下落。void BubbleSort(int a[],int length)//数组下标从0到n-1{ int temp; for(int i=0;i<length-1;i++) { for(int j=0;j<length-i-1;j++)原创 2021-04-18 17:36:58 · 128 阅读 · 0 评论 -
插入排序
插入排序的基本思想:每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有记录全部插入为止。一、直接插入排序a[0]不使用,用来作监视哨,也用来避免数组下标出界。每一次将当前失序的关键字放入监视哨,再遍历前面已经排好序的记录,将监视哨上的关键字插入适当的位置上。void Insert(int a[],int length)//直接插入排序{ int i,j; for(i=2;i<=length;i++) { if(a[原创 2021-04-17 23:10:01 · 186 阅读 · 0 评论 -
散列表查找
哈希表散列表一般指哈希表,散列查找法又称杂凑法或散列法。散列法通过对元素的关键字值进行某种运算,直接求出元素的地址,即使用关键字到地址的直接转换方法,而不需要反复比较。哈希表的存储空间通常是一个连续数组,散列地址是数组的下标;通常,哈希函数是一个一对多的函数,所以冲突是不可避免的,只能通过选择一个最优的哈希函数来最大的减少冲突。哈希函数并不唯一,一般按照实际情况构造哈希函数,主要有:(1)数字分析法:当事先明确知道关键字每一位上各种数字的分布情况时适用(2)平方取中法:当不能事先了解关键字的所有原创 2021-04-16 21:40:27 · 311 阅读 · 0 评论 -
树表查找
一、二叉排序树又称 二叉查找树,是一种对排序和查找都很有效的特殊二叉树。性质(1)其左右子树也分别为二叉排序树(2)中序遍历其可得到一个递增的有序序列(3)左子树所有结点均小于根结点,右子树所有结点均大于根结点二叉排序树的存储//二叉排序树的存储typedef struct{ int key; //还可设置其他数据项}KeyType;typedef struct BSTNode{ KeyType data; struct BSTNode *L,*R;原创 2021-04-15 21:31:10 · 453 阅读 · 0 评论 -
线性表查找
一、顺序查找直接遍历线性表或设置监视哨进行顺序查找。int Search(int a[],int key,int length){ int i; a[0]=key;//监视哨 for(i=length;a[i]!=key;i--); return i;}时间复杂度:O(n)设置监视哨,免去查找过程中每一步都要检测表是否查找完毕,虽然时间复杂度与直接遍历一样均为O(n),然而实践证明,当length>=1000时,这个改进能使顺序表进行一次查找所需的平均时间原创 2021-04-11 15:48:03 · 1173 阅读 · 1 评论 -
有向无环图
有向无环图简称DAG图,是用来描述一项工程或系统的进行过程的有效工具。AOV网:用顶点表示活动,用弧表示活动间的优先关系的有向图称为AOV网,是无权有向无环图AOE网:用顶点表示事件,弧表示活动权表示活动持续的时间称为AOE网,是带权有向无环图拓扑排序拓扑排序就是将AOV网中所有顶点按流程次序排成一个线性序列,该线性序列并不唯一,其过程为:(1)在有向图中选一个无前驱的顶点且输出它(2)从图中删除该顶点和并清除以它为前驱的入度(3)重复一、二步骤,直至不存在无入度为0的顶点(4)若此时输出原创 2021-04-10 21:37:41 · 996 阅读 · 0 评论 -
最短路径(图)
最短路径问题:一、源点到其余顶点的最短路径二、每一对顶点之间的最短路径一、迪杰斯特拉算法(Dijkstra)*Dijkstra:解决单源最短路径,按路径长度递增的次序产生最短路径的算法。*主要找出当前源点到其他顶点最短的一条路径,再利用此路径更新源点至各顶点的最小路径,循环往复直至源点到各顶点均为最短路径。定义邻接矩阵及辅助数组#include<stdbool.h>#define MAXSIZE 100#define INF 0x3f3f3f3f//邻接矩阵typedef s原创 2021-04-08 18:14:19 · 696 阅读 · 0 评论 -
最小生成树
在一个连通网的所有生成树中,各边权值之和最小的生成树成为最小生成树,对于具有n个顶点的连通网来讲,只需要n-1条边便可将所有顶顶点连通起来。多数最小生成树算法利用了简称为MST的性质,主要分为Prim算法和Kruskal算法**MST性质:**假设G=(V,E)是一个连通网,U是顶点V的一个非空子集。若(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树。Prim算法又称加点法:从第一个顶点开始,依次连通当前已连通顶点所未接通的权值最小的边对应的顶点,逐步原创 2021-04-06 22:14:29 · 167 阅读 · 0 评论 -
图优先遍历
DFS深度优先搜索DFS类似于树的先序遍历。将图从顶点开始进行深度优先搜索所走过的路径便是深度优先搜索树深度搜索遍历邻接矩阵表示图//邻接矩阵表示图typedef struct{ char vexs[MAXSIZE]; int arcs[MAXSIZE][MAXSIZE]; int vexnum,arcnum;}AMGraph;//深度搜索遍历邻接矩阵表示图void DFSAM(AMGraph G,int v){ visited[v]=true; p原创 2021-04-05 16:27:10 · 140 阅读 · 0 评论 -
图的存储
图的存储一.邻接矩阵对具有N个结点的图构造一个N*N的矩阵,矩阵数组的下标存储结点和相应顶点的位置,数组的值即为每两个邻接顶点的边的权值。邻接矩阵可以表示有向或无向图,当两个顶点不邻接相通时我们可以将数组权值赋为0或0x3f3f3f3f(趋近无穷大值又不会溢出)。缺点:不便于增加和删除顶点,不便于统计边的数目,时间复杂度高,空间复杂度高,对于稀疏图而言十分浪费空间。二.邻接表正邻接表:每个顶点建立一个链表,对无向图来说用于存放该顶点邻接的顶点,对有向图来说便是存放该顶点通向的邻接顶点。逆邻接表原创 2021-04-03 20:51:50 · 176 阅读 · 0 评论 -
哈夫曼树
哈夫曼树哈夫曼树又称最优树,是一类带权路径长度(WPL)最短的树,权值越大的结点离根结点越近,反之则越远。一颗含有N0个叶子结点的哈夫曼树共有2N0-1个结点*(因为哈夫曼树没有度为1的结点,即可设哈夫曼树叶子结点即度为0的结点数为N0,度为2的结点数为N2,总结点为N,则有N=2N2+1,N=N0+N2,可得N=2N0-1),哈夫曼树可以存储在一个大小为2N0的动态分配的一维数组w[]中,树的每个结点存储双亲和孩子的信息(下标)*哈夫曼树的建立1.初始化:动态申请2n个单元,通过循环将所有单元的双原创 2021-04-01 22:20:53 · 1612 阅读 · 0 评论 -
线索二叉树
线索二叉树二叉树的作为存储结构时不能直接获取前驱后继的信息,为此通过对二叉树线索化来构造线索二叉树,从而存储结点的前驱后继信息。构建线索二叉树有两种选择,一是增设两个指针域,但此行会使存储密度大大降低;二是利用二叉树的未被使用的空链域来存储前驱后继信息。我们一般选择后者构建线索树。中序线索化void InThread(BiThTree p){ if(p) { InThread(p->L); if(!p->L) {原创 2021-03-30 22:19:04 · 527 阅读 · 0 评论 -
二叉树
二叉树的性质1.二叉树的子树有左右之分,其次序不能颠倒。2.二叉树的第i层上最多有**2^(i-1)**个结点。3.深度为k的二叉树最多有2^k-1个结点。4.设二叉树的总结点数为N,终端(度为0)结点数为N0,度为1的结点数为N1,度为2的结点数为N2,分支总数为B,则有以下关系式:N=N0+N1+N2=B+1;因为除了根节点以外,其余结点都有分支进入,则有:B=N1+2N2;N=N1+2N2+1;结合上面式子可得:N0=N2+1,即终端结点数等于度为2的结点数加1;完全二叉树:深度为原创 2021-03-28 18:56:03 · 484 阅读 · 0 评论 -
串匹配算法
一开始接触到字符串匹配,就会想到百度搜索,输入一串需要搜索的信息,展现的页面是与关键字重合的网页,搜索引擎便是我目前能想到最典型的串匹配实例。串匹配算法主要来通过匹配来返回主串(T)中与模式串(P)完全重合的子串位置,一般分为BF算法和KMP算法。BF算法BF算法被称为最简单直观串匹配算法,利用i、j分别遍历T串和P串,当对应字符匹配时i、j则继续向下遍历;当对应字符不匹配时i则回溯,j则清0。若i遍历完T串时未找到完全匹配的字串则返回-1值,若匹配到完全重合的字串时则返回该子串的位置。int BF原创 2021-03-25 22:57:36 · 1191 阅读 · 1 评论