C
DFGOMC
爱编码,爱探索
展开
-
八大常用排序简单总结
八大常用排序简单总结假设含有n个记录的序列为{r1,r2,…,rn},其相应的关键字分别为{k1,k2,…,kn},需确定1,2,…,n的一种排列p1,p2,…,pn,使其相应的关键字满足kp1<=kp2<=…<=kpn(非递减或非递增)关系,即使得序列成为一个按关键字有序的序列(rp1,rp2,…,rpn),这样的操作称为排序。下面分类给出了各大算法的详细描述和实现的链接。排序的稳定性假设ki=kj(1<=i<=n,1<=j<=n,i≠j),且在排序前原创 2020-12-02 14:16:26 · 195 阅读 · 0 评论 -
快速排序(C语言简单实现)
快速排序(C语言简单实现)快速排序(Quick Sort)是冒泡排序的升级版。基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。对快速排序过程的理解:https://www.runoob.com/w3cnote/quick-sort.html/* 对顺序表L作快速排序 */void QuickSort(SqList *L){ QSort(L, 1, L->length);}原创 2020-12-02 14:07:06 · 1094 阅读 · 0 评论 -
堆排序(C语言简单实现)
堆排序(C语言简单实现)堆排序是对简单选择排序的升级版,简单选择排序链接。堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。堆排序算法堆排序(Heap Sort)就是利用堆进行排序的方法 。基本思想:将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的剩余的n-1个序列重新构造成一个堆,这样就会得到n原创 2020-11-30 17:44:11 · 4382 阅读 · 0 评论 -
希尔排序(C语言简单实现)
希尔排序(C语言简单实现)希尔排序是直接插入排序的升级版,直接插入排序每次增量是1,但希尔排序的增量increment比1大,也就是说直接插入排序是一个一个比较的,但是希尔排序是跳着来的,从而实现顺序表的基本有序,如果对直接插入排序不了解的可以看下我的另一篇文章:直接插入排序,看懂了直接插入排序再回来看希尔排序就很简单了。/* 顺序表L作希尔排序 */void ShellSort(SqList *L){ int i, j; int increment = L->length; do{原创 2020-11-29 17:32:40 · 2776 阅读 · 0 评论 -
归并排序(C语言简单实现)
归并排序(C语言简单实现)归并排序(Merging Sort)利用的就是归并的思想实现的排序方法。原理是:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,如此重复,直到得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序 。递归每次都将序列分一半,比如一个数组有18个数,那么第一次分出1-9和10-18,然后分别对两组继续分半,直到最后剩下一个元素时,即分好了组(此时全都是最小的组,只含一个元原创 2020-11-29 16:31:49 · 7684 阅读 · 0 评论 -
直接插入排序(C语言简单实现)
直接插入排序(C语言简单实现)本文参考自《大话数据结构》直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录新增1的有序表。/* 对顺序表L作直接插入排序 */void InsertSort(SqList *L){ int i, j; for(i=2;i<=L->length;i++){ if(L->r[i] < L->r[i-1]){ //需将L->r[i]插入有序子原创 2020-11-25 13:39:39 · 2271 阅读 · 0 评论 -
散列表/哈希表(C语言简单实现)
散列表/哈希表(C语言简单实现)本文参考自《大话数据结构》定义通过某个函数f计算出记录的存储位置,而不需要通过比较,这就是一种新的存储技术——散列技术。散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key) 。在查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。我们把这种对应关系f称为散列函数,又称为哈希函数。按照这个思路,采用散列技术将记录存储在一块连续的存储原创 2020-11-24 15:48:37 · 5050 阅读 · 5 评论 -
平衡二叉树(C语言简单实现)
平衡二叉树(C语言简单实现)本文参考自《大话数据结构》平衡二叉树是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1 。将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF(Balance Factor)。平衡二叉树首先必须是一棵二叉排序树,同时任一结点的左子树和右子树的高度差最多等于1 。距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,我们称为最小不平衡子树 。平衡二叉树实现原理平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,原创 2020-11-24 10:46:49 · 3691 阅读 · 9 评论 -
二叉排序树(C语言简单实现)
二叉排序树(C语言简单实现)本文参考自《大话数据结构》如果查找的数据集是有序线性表,并且是顺序存储的,查找可以用折半、插值、斐波那契等查找算法来实现,可惜,因为有序,在插入和删除操作上,就需要耗费大量的时间。二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树;构造一棵二叉原创 2020-11-22 14:32:25 · 3185 阅读 · 0 评论 -
查找(顺序、折半、插值、斐波那契)
查找(顺序、折半、插值、斐波那契)本文参考自《大话数据结构》 查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值得数据元素(或记录)顺序查找/* 顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字 */int Sequential_Search(int* a, int n, int key){ int i; for(i=1;i<=n;i++){ if(a[i] == key) return i; } return 0;}顺序查找优化原创 2020-11-20 17:41:22 · 136 阅读 · 0 评论 -
关键路径(C语言简单实现)
关键路径本文参考自《大话数据结构》,对关键路径的理解参考自:https://www.jianshu.com/p/1857ed4d8128在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,我们称之为AOE网 。我们把AOE网中没有入边的顶点称为始点或源点,没有出边的顶点称为终点或汇点。尽管AOE网和AOV网都是用来对工程建模的,但它们还是有很大的不同,主要体现在AOV网是顶点表示活动的网,只描述活动之间的制约关系,而AOE网是原创 2020-11-20 14:54:24 · 5320 阅读 · 3 评论 -
拓扑排序(C语言简单实现)
拓扑排序本文参考自《大话数据结构》AOV定义在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网(Activity On Vertex Network)。AOV网中的弧表示活动之间存在的某种制约关系。不可以存在环路设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,...,vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在顶点vj之前。则我们称这样的顶点序列为一个拓扑序列。所谓拓扑排序,就是对一原创 2020-11-19 17:40:53 · 5011 阅读 · 6 评论 -
最短路径-迪杰斯特拉(C语言简单实现)
最短路径(C语言简单实现)本文参考自《大话数据结构》,网上有很多关于迪杰斯特拉和弗洛伊德算法的描述和图解,大家都可以去看看,这里就不赘述,只是对迪杰斯特拉算法做简单实现。在网图和非网图中,最短路径的含义是不同的。由于非网图它没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径;而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点 。迪杰斯特拉(Dijkstra)算法这个算法的思路就是:求整个图的最短路径(原创 2020-11-19 12:40:45 · 2864 阅读 · 5 评论 -
最小生成树(C语言简单实现)
最小生成树本文参考自《大话数据结构》一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边。我们把构造连通网的最小代价生成树称为最小生成树 。找连通网的最小生成树,经典的有两种算法:普里姆算法和克鲁斯卡尔算法。普里姆(Prim)算法/* Prim算法生成最小生成树 */void MiniSpanTree_Prim(MGraph G){ int min, i, j, k; int adjvex[MAXVEX]; //保存相关顶点下标 int low原创 2020-11-17 17:30:13 · 7770 阅读 · 0 评论 -
图与图的遍历
图与图的遍历本文参考自《大话数据结构》定义图(graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。注意在图中数据元素,我们则称之为顶点(Vertex);在图结构中,不允许没有顶点;在图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的;各种图定义无向边 :若顶点vi到vj之间的边没有方向,则称这条边为无向边(Edge),用无序偶对(vi,vj)表示。如果图中任原创 2020-11-15 23:37:37 · 301 阅读 · 0 评论 -
哈夫曼树(C语言简单实现)
哈夫曼树(C语言简单实现)本文参考自《大话数据结构》,至于原理图那些,这里就不赘述了,网上很多,自己找。下面做了简单代码实现,代码依然存在较多缺陷,但是基本可运行,不喜勿喷,有改进和建议欢迎评论区评价。树的路径长度就是从树根到每一结点的路径长度之和。结点的带权的路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和。假设有n个权值{w1,w2,…,wn},构造一棵有n个叶子结点的二叉树,每个叶子结点带权wk,每个叶子的路径长度为1k,我们通常记原创 2020-11-13 00:25:54 · 4195 阅读 · 2 评论 -
线索二叉树(C语言简单实现)
线索二叉树本文参考自《大话数据结构》原理 对于一个有n个结点的二叉链表,每个结点有指向左右孩子的指针域,所以一共有2n个指针域。而n个结点的二叉树一共有n-1条分支数,也就是说,其实是存在2n-(n-1)=n+1个空指针域,这些空指针域不存储任何东西,白白浪费着内存的资源。 我们做遍历的时候,比如中序遍历,我们可以知道任意一个结点的前驱和后继是谁;但是在二叉链表中给你,我们只能知道每个结点指向其左右孩子结点的地址,而不知道某个结点的前驱和后继。 为了充分利用这些空地址,可以用来存放原创 2020-11-11 17:25:18 · 585 阅读 · 0 评论 -
选择排序
选择排序通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换。/* 对顺序表L作简单选择排序*/void SelectSort(SqList *L){ int i, j, min; for(i=1;i<L->length;i++){ min = i; for(j=i+1;j<=L->length;j++){ if(L->r[min] > L->r[j]) min =原创 2020-11-10 20:57:23 · 149 阅读 · 0 评论 -
冒泡排序
冒泡排序本文参考自《大话数据结构》,这本书介绍的冒泡排序让我对之前学的冒泡有了更深的理解。冒泡排序(Bubble Sort)一种交换排序,基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止 。交换函数/* 交换值 */void swap(SqList* L, int i, int j){ int temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp;}1.0版本/* 顺原创 2020-11-10 20:50:12 · 338 阅读 · 0 评论 -
二叉树(C语言简单实现)
本文参考自《大话数据结构》树定义树是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:有且仅有一个特定的称为根(Root)的结点;当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…、Tm,其中每一个集合本身又是一颗树,并且称为根的子树。树的结点包含一个数据元素及若干指向其子树的分支。 结点拥有的子树数称为结点的度。度为0的结点称为叶结点或终端结点;度不为0的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点。树的度是.原创 2020-10-31 21:48:02 · 1770 阅读 · 0 评论 -
串(C语言简单实现)
串(C语言)本文参考自《大话数据结构》定义串是由零个或多个字符组成的有限序列,又名叫字符串。抽象数据类型ADT 串(string)DATA 串中元素仅由一个字符组成,相邻元素具有前驱和后继关系。Operation StrAssign(T,*chars):生成一个其值等于字符串常量chars的串T StrCopy(T,S):串S存在,由串S复制得串T ClearString(S):串S存在,将串清空 StringEmpty(S):若串S为空,返回true,否则返回原创 2020-10-19 13:59:56 · 1546 阅读 · 0 评论 -
循环队列(C语言简单实现)
循环队列定义把队列中,头尾相接的顺序存储结构成为循环队列。循环队列存在的问题:当空队列时,front 等于 rear;当队列满时,front 等于 rear,那么如何才能判断队列是满还是空?解决:当队列空时,条件就是front=rear;当队列满时,保留一个元素空间。即当队列满时,数组中还有一个空闲单元。假设队列的最大尺寸为QueueSize,那么队列满的条件就是:(rear+1)%QueueSize == front;队列的长度计算公式:(rear-front+QueueSize)%Q原创 2020-10-16 17:59:11 · 431 阅读 · 0 评论 -
队列(C语言简单实现)
队列(C语言)本文参考自《大话数据结构》定义 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表,简称FIFO(First In First Out),允许插入的一端称为队尾,允许删除的一端称为队头。抽象数据结构ADT 队列(Queue)Data struct Queue{ SElemType data; //数据域 struct Queue* front; //前驱 struct Queue* next; //后继 }; st原创 2020-10-16 15:16:40 · 613 阅读 · 0 评论 -
四则运算中缀转后缀(C语言)
四则运算中缀转后缀(C语言)本文参考自《大话数据结构》算法思路遇到数字直接输出,使用栈来存储,通过比较运算符的优先级,判断是否要将栈顶符号输出:如果栈顶符号优先级不比字符串当前所指符号优先级低,则输出;否则将符号入栈;括号优先级最高(),遇到 ) 括号则匹配栈中的 **( ** 括号,将括号中所有符号输出;字符串遍历结束后,将栈中符号全部输出;原书例题9+(3-1)*3+10/2:数字9直接输出,输出结果:9栈为空,栈中没有符号,此时+号入栈,栈中符号为(左边为栈顶):+(原创 2020-10-12 13:04:54 · 349 阅读 · 0 评论 -
C语言链表实现简单多项式加法
基于C语言实现简单的一元多项式加法本文参考自《大话数据结构》,有错漏的地方欢迎指点。 正在复习数据结构,因为还没有复习到树结构,所以这里只是用链表对一元多项式加法做简单的实现,待后面复习到树结构,会对多项式加法进行重构。1.算法思路一元多项式的结构固定为Ax^n,因为x是固定的,所以结构体里只需要存储系数A和指数n就行;一元多项式Ax^n的结构分为4种:A=0,n!=0时,多项式为x^n,此时系数coef=0,指数exp=n;A!=0,n=0时,多项式为A,此时系数coef=A,指数e原创 2020-10-10 10:12:30 · 1527 阅读 · 0 评论 -
链式栈(C语言版)
本文参考自《大话数据结构》栈的链式存储结构及实现对于链栈来说,基本不存在栈满的情况,除非内存已经没有可以使用的空间;而空栈,其实就是栈顶指针top=null的时候。1.链栈的结构代码typedef struct StackNode{ SElemType data; //数据域 struct StackNode *next; //下一个结点指针}StackNode, *LinkStackPtr;typedef struct LinkStack{ LinkStackP.原创 2020-10-08 22:22:57 · 325 阅读 · 0 评论 -
两栈共享空间(数组)
两栈共享空间(数组)本文参考资料:《大话数据结构》两栈共享空间的结构代码/* 两栈共享空间结构 */typedef struct{ SElemType data[MAXSIZE]; int top1; //栈1栈顶指针 int top2; //栈2栈顶指针}SqDoubleStack;对于两栈共享空间的push方法,除了要插入元素值参数外,还需要有一个判断是栈1还是栈2的栈号参数stackNumber;/* 插入元素e为新的栈顶元素 */Status Pus原创 2020-10-08 18:31:23 · 1010 阅读 · 0 评论 -
栈(数组)
本文参考自《大话数据结构》栈与队列栈是限定只能在表尾进行插入和删除操作的线性表;队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表;1.栈的定义 我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不包含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,简称LIFO(Last In First Out)结构。栈的插入操作,叫做进栈,也称压栈,入栈;栈的删除操作,叫做出栈,也有的叫做弹栈;2.栈的抽象数据类型把插入和删除操作改名为push和pop;ADT 栈(s.原创 2020-10-07 23:52:22 · 444 阅读 · 0 评论 -
C语言数组实现栈
C语言数组实现栈C语言数组形式实现栈1.栈的定义 我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不包含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,简称LIFO(Last In First Out)结构。2.栈的抽象数据类型把插入和删除操作改名为push和pop;ADT 栈(stack)Data 同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。Operation InitStack(*S):初始条件,建立一个空栈S; DestroyStack(*S):若栈存原创 2020-08-06 22:51:36 · 5898 阅读 · 0 评论 -
C语言实现双向循环链表
C语言实现双向循环链表本篇是关于双向循环链表的简单实现,有错漏的地方请在评论区评价。 双向链表是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前驱。结构体/* 线性表的双向链表存储结构 */typedef struct DulNode{ ElemType data; //数据域 struct DulNode *prior; //直接前驱指针 struct DulNode *next; //原创 2020-08-05 22:25:41 · 263 阅读 · 0 评论 -
循环链表
循环链表将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。合并链表p = rearA->next //保存A表的头结点,即1rearA->next = rearB->next->next; //指向B表的第一个结点(不是头结点,即2)rearB->next = p; //将原A表的头结点赋值给rearB->next,即3free(p); //释放p基本功能实现代码#incl原创 2020-08-04 22:57:10 · 150 阅读 · 0 评论 -
单链表-链式存储结构
单链表-链式存储结构本文参考自《大话数据结构》,有兴趣的读者可以自己找书看看。书中介绍 为了表示每个数据元素ai与直接后继数据元素a(i+1)之间的逻辑关系,对数据元素a1来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称作指针或链。这两部分信息组成数据元素ai的存储映像,称为结点(Node)。 n个结点(ai的存储映像)链接成一个链表,即为线性表(a1,a2,原创 2020-08-03 23:13:26 · 1934 阅读 · 1 评论 -
单链表-顺序存储
单链表-顺序存储本文参考自《大话数据结构》,有兴趣的读者可以自行阅读。顺序存储结构#define MAXSIZE 20 //存储空间初始分配量typedef int ElemType; //ElemType类型根据实际情况而定,这里假设为inttypedef struct{ ElemType data[MAXSIZE]; //数组存储数据元素,最大值为MAXSIZE int length; //线性表当前长度}SqList;对于第i个数据元素ai的存储位置可以由a1推算原创 2020-08-02 19:32:18 · 1370 阅读 · 0 评论