学习心得
yjf0725
这个作者很懒,什么都没留下…
展开
-
快速排序
调用库函数#include <stdlib.h>/*---------------简单整数排序--------------------*/int compare(const void *a, const void *b){ /* 比较两整数。非降序排列 */ return (*(int*)a - *(int*)b);}/* 调用接口 */ qsort(A, N, sizeof(int), compare);/*---------------简单整数排序---------原创 2021-02-28 22:30:13 · 140 阅读 · 1 评论 -
归并排序
递归实现/* L = 左边起始位置, R = 右边起始位置, RightEnd = 右边终点位置*/void Merge( ElementType A[], ElementType TmpA[], int L, int R, int RightEnd ){ /* 将有序的A[L]~A[R-1]和A[R]~A[RightEnd]归并成一个有序序列 */ int LeftEnd, NumElements, Tmp; int i; LeftEnd = R - 1;原创 2021-02-23 23:33:53 · 110 阅读 · 0 评论 -
堆排序
void Swap( ElementType *a, ElementType *b ){ ElementType t = *a; *a = *b; *b = t;} void PercDown( ElementType A[], int p, int N ){ /* 改编代码4.24的PercDown( MaxHeap H, int p ) */ /* 将N个元素的数组中以A[p]为根的子堆调整为最大堆 */ int Parent, Child; Element原创 2021-02-23 23:32:04 · 81 阅读 · 0 评论 -
拓扑排序
bool TopSort( LGraph Graph, Vertex TopOrder[] ){ /* 对Graph进行拓扑排序, TopOrder[]顺序存储排序后的顶点下标 */ int Indegree[MaxVertexNum], cnt; Vertex V; PtrToAdjVNode W; Queue Q = CreateQueue( Graph->Nv ); /* 初始化Indegree[] */ for (V=0; V<原创 2021-02-08 23:39:32 · 178 阅读 · 0 评论 -
最短路径问题
无权图的单源最短路算法/* dist[]和path[]全部初始化为-1 */void Unweighted ( LGraph Graph, int dist[], int path[], Vertex S ){ Queue Q; Vertex V; PtrToAdjVNode W; Q = CreateQueue( Graph->Nv ); /* 创建空队列, MaxSize为外部定义的常数 */ dist[S] = 0; /* 初始化源点 */原创 2021-02-04 23:39:28 · 121 阅读 · 0 评论 -
邻接表存储、邻接矩阵存储
邻接表存储void Visit( Vertex V ){ printf("正在访问顶点%d\n", V);}/* Visited[]为全局变量,已经初始化为false */void DFS( LGraph Graph, Vertex V, void (*Visit)(Vertex) ){ /* 以V为出发点对邻接表存储的图Graph进行DFS搜索 */ PtrToAdjVNode W; Visit( V ); /* 访问第V个顶点 */ Visit原创 2021-01-31 23:44:42 · 146 阅读 · 1 评论 -
图的抽象数据类型及表示
什么是图表示多对多的关系包含:一组顶点:通常用V(Vertex)表示顶点集合一组便:通常用E(Edge)表示边的集合抽象数据类型定义类型名称:图数据对象集:G(V,E)由一个非空的有限顶点集合V和一个有限边集合E组成操作集:对于任意图 G∈Graph,以及v∈V,e∈EGraph Create():建立并返回空图Graph InsertVertex(Graph G, Vertex v):将v插入GGraph InsertEdge(Graph G, Edge e):将e插入Gvoid原创 2021-01-29 23:11:53 · 794 阅读 · 0 评论 -
集合及运算
集合的表示集合运算交、并、补、差,判定一个元素是否属于某一集合并查集集合并、查元素属于什么集合集合运算查找某个元素所在的集合int Find( SetType S[], ElementType X){ int i; for(i=0;i < MaxSize && S[i].Data != X;i++); if( i >= MxaSize) return -1; for(;S[i].Parent >= 0; i = S[i]Parent);原创 2021-01-27 23:58:47 · 71 阅读 · 0 评论 -
二叉搜索树
二叉搜索树一课二叉树,满足以下性质:1)非空左子树的所有键值小于其根结点的键值2)非空右子树的所有键值大于其根结点的键值3)左、右子树都是二叉搜索树二叉搜索树的查找操作查找从根节点开始,如果树为空,返回NULL若搜索树非空,则根结点关键字和X进行比较,并进行不同处理:1)若X小于根结点键值,只需要在左子树中继续搜索2)若X大于根结点键值,在右子树中继续搜索3)若两者比较结果相等,搜索完成,返回指向此结点的指针Position Find (ElementType X, BinTree B原创 2021-01-24 00:20:42 · 145 阅读 · 0 评论 -
二叉树的遍历
二叉树的遍历先序遍历遍历过程为1)访问根结点2)先序遍历其左子树3)先序遍历其右子树void PreOrderTraversal (BinTree BT){ if(BT) { printf("%d", BT->Data); PreOrderTraversal( BT->Left); PreOrderTraversal( BT->Right); }}中序遍历遍历过程为1)中序遍历其左子树2)访问根结点3)中序遍历其右子树void InOrder原创 2021-01-18 23:47:06 · 117 阅读 · 0 评论 -
二叉树定义、性质
二叉树二叉树:一个有穷的结点集合这个集合可以为空若不为空。则它是由根节点和称为其左子树TLT_LTL和右子树TRT_RTR的两个不相交的二叉树组成二叉树的几个重要性质一个二叉树第i层的最大结点数为:2i−12^{i-1}2i−1,i≥1深度为k的二叉树有最大结点总数为:2k2^k2k-1,k≥1对任何非空二叉树T,若n0n_0n0表示叶结点的个数、n−2n-2n−2是度为2的非叶结点个数,那么两者满足关系n0n_0n0=n2n_2n2+1。二叉树抽象数据类型定义类型名称:二叉树原创 2021-01-18 00:03:46 · 137 阅读 · 0 评论 -
树与树的表示
树的定义树:n(n≥0)个结点构成的有限集合当n=0时,称为空树对于任一棵非空树(n>0),它具备以下性质1)树中有一个称为“根(Root)”的特殊节点,用r表示2)其余结点可分为m(m>0)个互不相交的有限集T1T_1T1,T2T_2T2,…,TmT_mTm,其中每个集合本身又是一棵树,称为原来树的“子树”(Sub Tree)子树是不相交的除了根节点外,每个结点有且仅有一个父结点一棵树N个结点的树有N-1条边树的一些基本术语1)结点的度(Degree):结点的子树个数原创 2021-01-15 23:58:15 · 106 阅读 · 0 评论 -
复杂度分析
空间复杂度S(n)根据算法写成的程序在执行时占用存储单元的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。时间复杂度T(n)根据算法写成的程序在执行时耗费的时间长度。这个长度往往也与输入数据的规模有关。时间复杂度过高的抵消算法可能导致我们在有生之年都等不到运行结果。复杂度分析在分析一般的算法效率时,一般关注两种复杂度最坏情况复杂度Tworst(n)T_{worst}(n)Tworst(n)平均复杂度Tavg(n)T_{avg}(n)Ta原创 2021-01-14 23:56:07 · 195 阅读 · 0 评论 -
查找
查找查找表概念查找表是由同类型的数据元素(或记录)构成的集合对查找表基本操作1)查询某个数据元素是否在查找表中2)检索某个数据元素的各种属性3)在查找表中插入一个数据元素4)从查找表中删去某个数据元素查找表分类1)静态查找表仅作查询和检索操作的查找表2)动态查找表“查询” 结果 “不在查找表中” ->数据元素插入到查找表中“查询” 结果为 “在查找表中” 的数据元素->删除关键字是数据元素中某个数据项的值,用以标识一个数据元素若关键字能识别唯一的一个数据元素,则原创 2021-01-10 00:37:38 · 186 阅读 · 0 评论 -
栈的基本操作
栈的定义栈是限定在表的同一端进行插入或删除操作的线性表。进行插入或删除操作的一端称为**栈顶**,另一端成为**栈底**。没有数据元素的栈称为**空栈**。插入数据元素的操作称为**入栈**,删除数据元素的操作称为**出栈**。栈的顺序存储顺序栈入栈Status Stack_Push(StackPtr s,StackEntry item){ Status outcome = success; if(s->top == MAXSTACK-1) outcome = overflow;原创 2021-01-07 23:35:13 · 176 阅读 · 0 评论 -
线性表链式存储结构
单链表用一组地址任意的存储单元存放线性表中的数据元素数据域(数据元素)+指针域(指示后继元素的存储位置)=结点以 “结点的序列” 表示线性表——称作链表单链表基本操作及实现查找按位置查找链表的操作只能通过从头指针出发,顺着链域next逐个结点比较,直到搜索到指定位置的结点为止Status List_Retrieve(SqListPtr L, int pos, ElemType *elem){ Status s = range_error; Ptr p = (*L)->next;原创 2021-01-06 23:56:36 · 225 阅读 · 0 评论 -
线性表顺序结构基本操作
线性表的顺序存储结构用一组地址连续的存储单元,依次存放线性表中的数据元素(线性表的起始地址s称作线性表的基地址)顺序存储结构的实现用结构来整合分配空间 :——静态:数组——动态:指针**线性表顺序存储结构上基本操作的实现**1.初始化Status List_lnit(SqListPtr L){ Status s = success; L->list_size = LIST_INIT_SIZE; L->length = 0; L->elem = (ElemT原创 2021-01-06 00:30:25 · 223 阅读 · 0 评论 -
线性表
1.线性表表示的是线性结构2.在线性结构中,数据元素之间存在着一对一的关系,其特点是数据元素之间按某种规定存在一个顺序关系3.特点:数据类型相同位序i从1开始前驱和后继4.基本操作:初始化和销毁引用加工:插入和删除5.线性表的顺序存储结构-------顺序表顺序表是把线性表中的所有元素按照其逻辑顺序依次存储在计算机存储器中指定存储位置开始的一块连续的存储空间中6.线性表的链式存储结构-------链表在链式存储中,每个存储点不仅包含元素本身的信息,数据域,还包含元素之间的逻辑关系,原创 2021-01-04 23:43:45 · 89 阅读 · 0 评论