合集-数据结构

串->串的应用
摘要:应用1:文本编辑 应用2:建立词索引表 阅读全文

posted @ 2019-05-01 18:27 lonelydeath 阅读(313) 评论(0) 推荐(0)

串->串的表示和实现
摘要:文字描述: 串,就是字符串的意思。在数据结构中,串的存储方式有三种:定长顺序存储表示、堆分配存储表示和块链存储表示: 定长顺序存储表示: 以一组地址连续的存储单元存放字符序列,按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。超出预定义的串值会被舍弃,成为“截断”。 堆分配存储表示: 以 阅读全文

posted @ 2019-05-01 18:26 lonelydeath 阅读(1096) 评论(0) 推荐(0)

队列->队列的应用(银行业务模拟)
摘要:文字描述 示意图 代码实现 1 // 2 // Created by Zhenjie Yu on 2019-04-13. 3 // 4 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 #include <unist 阅读全文

posted @ 2019-04-16 19:36 lonelydeath 阅读(545) 评论(0) 推荐(0)

队列->队列的表示和实现
摘要:文字描述 队列是和栈相反,队列是一种先进先出(first in first out,缩写FIFO)的线性表,它只允许在表的一端进行插入,而在另一端进行删除。和生活中的排队相似,最早进入队列的元素最早离开。在队列中,允许插入的一端加队尾,允许删除的一端叫队头。 另外除了栈和队列,还有一种限定性数据结构 阅读全文

posted @ 2019-04-16 19:05 lonelydeath 阅读(535) 评论(0) 推荐(0)

栈->栈与递归
摘要:文字简述 1.阶乘函数 2.2阶Fiibonacci数列 3.n阶Hanoi塔问题 代码实现 1 // 2 // Created by lady on 19-4-3. 3 // 4 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <stri 阅读全文

posted @ 2019-04-16 18:34 lonelydeath 阅读(245) 评论(0) 推荐(0)

栈->栈的应用
摘要:e.g.1 数制转换 十进制数N和其它d进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理。 假设编写一个程序:对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数。由于上述计算过程是从低位到高位顺序产生八进制数的各个数位,而打印输出,一般来说应从高位到低位 阅读全文

posted @ 2019-04-16 18:19 lonelydeath 阅读(383) 评论(0) 推荐(0)

栈->栈的基本定义
摘要:定义: 栈是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表成为空栈。 示意图: 顺序栈的表示和实现 可以在初始化时分配一块连续的内存,base指向其起始地址, top指向栈顶;当入栈的时候,数据存放在top上,然后将top增 阅读全文

posted @ 2019-04-16 18:16 lonelydeath 阅读(677) 评论(0) 推荐(0)

线性表->应用->一元多项式
摘要:文字描述 在数学上,一个一元多项式可以按升幂写成如下形式。 它由n+1个系数唯一确定。因此,在计算机里,可以用一个线性表P来表示,P中每一项的指数i隐含在其系数pi的序号里。 但是在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难确定。比如如下多项式,就要用一个长度为20 阅读全文

posted @ 2019-02-20 12:42 lonelydeath 阅读(594) 评论(0) 推荐(0)

线性表->链式存储->双向链表
摘要:文字描述 之前的链表(单链表、循环链表)的链式存储结构中只有一个指示直接后继的指针域。由此,从某个结点出发只能顺指针往后寻查其他结点。若要寻查结点的直接前驱,则需从表头指针出发。即单链表中,NextElem的执行时间为1,而PriorElem的执行时间为n。为了克服单链表这种缺点,可利用双向链表。 阅读全文

posted @ 2019-02-17 19:04 lonelydeath 阅读(258) 评论(0) 推荐(0)

线性表->链式存储->循环链表
摘要:文字描述 循环链表是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。由此,从表中任一结点出发均可找到表中其他结点。 示意图 算法分析 插入、删除、查找等同单链表。 代码实现 1 // 2 // Created by lady on 19-1-27. 3 / 阅读全文

posted @ 2019-02-17 18:48 lonelydeath 阅读(316) 评论(0) 推荐(0)

线性表->链式存储->线形链表(单链表)
摘要:文字描述: 为了表示前后两个数据元素的逻辑关系,对于每个数据元素,除了存储其本身的信息之外(数据域),还需存储一个指示其直接后继的信息(即直接后继的存储位置,指针域)。 示意图: 算法分析: 在单链表中插入和删除元素时,主要是改变指针的值,其时间复杂度为1。而顺序存储的话,其时间复杂度为n。 在单链 阅读全文

posted @ 2019-02-17 17:27 lonelydeath 阅读(374) 评论(0) 推荐(0)

线性表->顺序存储
摘要:文字描述: 用一组地址连续的存储单元依次存储线性表的数据元素,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。 即是,线性表的顺序存储结构的特定是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置 阅读全文

posted @ 2019-02-17 16:37 lonelydeath 阅读(1242) 评论(0) 推荐(0)

线性表(总结篇)
摘要:线性表的基本定义: 一个线性表是n个数据元素的有限序列,在一个非空的线性表中,(1)存在唯一的一个被称为“第一个”的数据元素;(2)存在惟一的一个被称为“最后一个”的数据元素; (3)除第一个之外,其他的每一个数据元素均只有一个前驱;(4)除最后一个之外,其他的每一个数据元素均只有一个后继。 线性表 阅读全文

posted @ 2019-02-17 16:30 lonelydeath 阅读(164) 评论(0) 推荐(0)

动态存储管理(小结篇)-待完善
摘要:动态存储管理 假设在系统刚开工时, 整个内存区是一个“空闲块”(在编译程序中称为“堆”)。 下图a为依次给8个用户进行分配后的系统的内存状态。 下图b为一段时间后,有的用户运行结束,它所占用的内存区变成空闲块,这时整个内存区呈现出占用块和空闲块犬牙交错的状态。 假设又有新的用户进行系统请求分配内存, 阅读全文

posted @ 2019-01-11 15:02 lonelydeath 阅读(216) 评论(0) 推荐(0)

图->最短路径->多源最短路径(弗洛伊德算法Floyd)
摘要:文字描述 求每一对顶点间的最短路径,可以每次以一个顶点为源点,重复执行迪杰斯特拉算法n次。这样,便可求得每一对顶点之间的最短路径。总的执行时间为n^3。但是还有另外一种求每一对顶点间最短路径的方法,就是弗洛伊德(Floyd)算法,它的时间复杂度也为n^3,但是形式上更简单,其基本思想如下: 如果无法 阅读全文

posted @ 2019-01-06 18:05 lonelydeath 阅读(450) 评论(0) 推荐(0)

图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)
摘要:文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息。上面这些问题,都可以转化为求图中,两顶点最短带权路径的问题。 单源点的最短路径问题: 给定带权有向图G和源点v,求从v到G中其余各顶点的 阅读全文

posted @ 2019-01-04 18:05 lonelydeath 阅读(613) 评论(0) 推荐(0)

图->有向无环图->求关键路径
摘要:文字描述 与AOV-网相对应的是AOE-网(Activity on Edge)即边表示活动的网。AOE-网是一个带权的有向无环图。其中,顶点表示事件Event,弧表示活动,权表示活动持续的时间。通常,AOE-网可用来估算工程的完成时间。 对AOE-网来说,研究的问题有两个:(1)完成整项工程至少需要 阅读全文

posted @ 2018-12-29 17:38 lonelydeath 阅读(1036) 评论(0) 推荐(0)

图->有向无环图->拓扑排序
摘要:文字描述 关于有向无环图的基础定义: 一个无环的有向图称为有向无环图,简称DAG图(directed acycline graph)。DAG图是一类较有向树更一般的特殊有向图。 举个例子说明有向无环图的应用。假如有一个表达式: ((a+b)*(b*(c+d))+(c+d)*e)*((c+d)*e), 阅读全文

posted @ 2018-12-29 12:09 lonelydeath 阅读(1184) 评论(0) 推荐(0)

图->连通性->关节点和重连通分量
摘要:文字描述 相关定义:假若在删去顶点v以及和v相关联的各边之后,将图的一个连通分量分割成两个或两个以上的连通分量,则称顶点v为该图的一个关节点.一个没有关节点的连通图称为重连通图. 在重连通图上,任意一对顶点之间至少存在两条路径, 则在删去某个顶点以及依附于该顶点的各边时也不破坏图的连通性.若在连通图 阅读全文

posted @ 2018-12-16 13:54 lonelydeath 阅读(1638) 评论(0) 推荐(1)

图->遍历
摘要:文字描述 从图中某一顶点出发遍历图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫图的遍历。 深度优先搜索:类似树的先根遍历;假设初始状态下,图中所有顶点都未曾被访问,则从某个顶点出发,访问此顶点,然后依次从v的未被访问的邻接点出发继续深度优先遍历图,直到图中所有和v有路径相通的顶点都被访问到; 阅读全文

posted @ 2018-10-10 18:14 lonelydeath 阅读(654) 评论(0) 推荐(0)

图->连通性->无向图的连通分量和生成树
摘要:文字描述 对无向图进行遍历时,对于连通图,仅需从图中任一顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图中所有顶点。但对非连通图,则需从多个顶点出发搜索,每一次从一个新的起始点出发进行搜索过程得到的顶点访问序列恰为其各个连通分量中的顶点集。 对于非连通图,每个连通分量中的顶点集,和遍历时走过的 阅读全文

posted @ 2018-11-02 12:08 lonelydeath 阅读(2208) 评论(0) 推荐(0)

图->连通性->有向图的强连通分量
摘要:文字描述 有向图强连通分量的定义:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通 阅读全文

posted @ 2018-12-08 18:27 lonelydeath 阅读(1793) 评论(0) 推荐(0)

图->连通性->最小生成树(普里姆算法)
摘要:文字描述 用连通网来表示n个城市及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价。对于n个定点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。现在,我们要选择这样一个生成树,使总的耗费最少。这个问题就是构造连通网的最小代价生成 阅读全文

posted @ 2018-12-09 17:31 lonelydeath 阅读(1307) 评论(0) 推荐(0)

图->连通性->最小生成树(克鲁斯卡尔算法)
摘要:文字描述 上一篇博客介绍了最小生成树(普里姆算法),知道了普里姆算法求最小生成树的时间复杂度为n^2, 就是说复杂度与顶点数无关,而与弧的数量没有关系; 而用克鲁斯卡尔(Kruskal)算法求最小生成树则恰恰相反。它的时间复杂度为eloge (e为网中边的数目),因此它相对于普里姆算法而言,适合于求 阅读全文

posted @ 2018-12-15 17:21 lonelydeath 阅读(614) 评论(0) 推荐(0)

查找->动态查找表->B-树(无代码)
摘要:文字描述 B-树定义 一颗m阶的B-树,或者是空树,或者是满足下列特性的m叉树: (1) 树中每个结点至多m颗子树 (2) 若根结点不是叶子结点,则根结点至少有两颗子树 (3) 除根结点外的所有非终端结点至少有棵子树 (4) 所有非终端结点中包含下列信息数据(n, A0, K1, A1, K2, A 阅读全文

posted @ 2018-08-28 18:37 lonelydeath 阅读(423) 评论(0) 推荐(0)

查找->动态查找表->B+树(无代码)
摘要:文字描述 B+树定义 B+树是应文件系统所需而出的一种B-树的变型树。一棵m阶的B+树和m阶的B-树的差异在于: (1)有n棵子树的结点中含有n个关键字 (2)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小从小到大顺序链接。 (3)所有的非终端结点 阅读全文

posted @ 2018-08-28 18:41 lonelydeath 阅读(373) 评论(0) 推荐(0)

查找->动态查找表->键树(无代码)
摘要:文字描述 键树定义 键树又叫数字查找树,它是一棵度大于或等于2的树,树中的每个结点中不是包含一个或几个关键字,而是只含有组成关键字的符号。例如,若关键字是数值,则结点中只包含一个数位;若关键字是单词,则结点中只包含一个字母字符。从根到叶子结点的字符组成的字符串表示一个关键字,叶子结点中的特殊符号$表 阅读全文

posted @ 2018-08-28 18:48 lonelydeath 阅读(243) 评论(0) 推荐(0)

查找->动态查找表->哈希表
摘要:文字描述 哈希表定义 在前面讨论的各种查找算法中,都是建立在“比较”的基础上。记录的关键字和记录在结构中的相对位置不存在确定的关系,查找的效率依赖于查找过程中所进行的比较次数。而理想的情况是希望不经过任何比较,一次存取便能得到所查记录,那就必须在记录的存储位置和关键字之间建立一个确定的对应关系f。查 阅读全文

posted @ 2018-08-28 18:51 lonelydeath 阅读(1272) 评论(0) 推荐(0)

图(总结篇)
摘要:1 图的定义和术语 2 图的存储结构 数组表示法 邻接表 十字链表 邻接多重表 3 图的遍历 深度优先遍历和广度优先遍历 4 图的连通性问题 无向图的连通分量和生成树 有向图的强连通分量 最小生成树 普里姆算法 克鲁斯卡尔(Kruskal)算法 关节点和重连通分量 5 有向无环图及其应用 拓扑排序 阅读全文

posted @ 2018-10-02 18:05 lonelydeath 阅读(205) 评论(0) 推荐(0)

图->定义
摘要:文字描述 顶点 指图中的数据元素 弧尾 若<v,w>属于两个顶点之间的关系的集合,表示从v到w的一条弧,则v为弧尾或初始点 弧头 若<v,w>属于两个顶点之间的关系的集合,表示从v到w的一条弧,则v为弧头或终端点 有向图 由弧组成的图称为有向图 边 若<v,w>属于VR,必有<w,v>输入VR,即V 阅读全文

posted @ 2018-10-02 18:07 lonelydeath 阅读(251) 评论(0) 推荐(0)

图->存储结构->数组表示法(邻接矩阵)
摘要:文字描述 用两个数组分别存储顶点信息和边/弧信息。 示意图 算法分析 构造一个采用邻接矩阵作存储结构、具有n个顶点和e条边的无向网(图)G的时间复杂度是(n*n + e*n), 其中对邻接矩阵G.arcs的初始化耗费了n*n的时间。 借助于邻接矩阵容易判定两个顶点之间是否有边/弧相连,并容易求得各个 阅读全文

posted @ 2018-10-02 18:11 lonelydeath 阅读(2524) 评论(0) 推荐(0)

图->存储结构->邻接表
摘要:文字描述 邻接表是图的一种链式存储结构。在邻接表中,对图中每个顶点建立一个单链表,第i个单链表的结点表示依附顶点vi的边(对有向图是指以顶点vi为尾的弧)。单链表中的每个结点由3个域组成,其中邻接点域adjvex指示与顶点vi邻接的点在图中的位置;链域nextarc指示下一条边或弧的结点;数据域in 阅读全文

posted @ 2018-10-02 18:15 lonelydeath 阅读(1402) 评论(0) 推荐(0)

图->存储结构->十字链表
摘要:文字描述 十字链表是有向图的另一种链式存储结构. 在十字链表中,对应于有向图中每一条弧有一个结点,对应于每个顶点也有一个结点.这些结点的结构如下所示: 在弧结点中有5个域: 尾域tailvex和头域headvex分别指示弧尾和弧头这两个顶点在图中的位置,链域hlink指向与弧头相同的下一条弧, 而链 阅读全文

posted @ 2018-10-02 18:21 lonelydeath 阅读(1202) 评论(0) 推荐(0)

图->存储结构->邻接多重表
摘要:文字描述 邻接多重表是无向图的另一种链式存储结构. 虽然邻接表是无向图的一种很有效的存储结构,在邻接表中容易求得顶点和边的各种信息. 但是,在邻接表中每一条边(vi,vj)有两个结点,分别在第i个和第j个链表中,这给某些图的操作带来不便。如对已被搜索过的边作记号或删除一条边等,此时需要找到表示同一条 阅读全文

posted @ 2018-10-02 18:23 lonelydeath 阅读(7158) 评论(0) 推荐(1)

树和二叉树->线索二叉树
摘要:文字描述 从二叉树的遍历可知,遍历二叉树的输出结果可看成一个线性队列,使得每个结点(除第一个和最后一个外)在这个线形队列中有且仅有一个前驱和一个后继。但是当采用二叉链表作为二叉树的存储结构时,只能得到结点的左孩子结点和右孩子结点,要想知道结点的前驱或后继,需要再遍历一次才知道。另外,叶子结点的左右孩 阅读全文

posted @ 2018-08-09 18:08 lonelydeath 阅读(625) 评论(0) 推荐(0)

树和二叉树->最优二叉树
摘要:文字描述 结点的路径长度 从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称作路径长度。 树的路径长度 从树根到每一个结点的路径长度之和叫树的路径长度。 结点的带权路径长度 从该结点到树根之间的路径长度与结点上权的乘积 树的带权路径长度 所有叶子结点的带权路径长度之和 阅读全文

posted @ 2018-08-13 12:07 lonelydeath 阅读(436) 评论(0) 推荐(0)

树和二叉树->其他(待完善)
摘要:关于树和二叉树的部分,还有如下三个知识点,待以后时间更充裕的时候再回头完善。 1 树与等价问题 文字描述 关于等价关系和等价类的定义,在离散数学上的描述有点拗口, 其实在数据结构中,这部分相关的主要是如下三个函数: 示意图 算法分析: 代码实现 1 // 2 // Created by lady o 阅读全文

posted @ 2018-08-13 18:07 lonelydeath 阅读(187) 评论(0) 推荐(0)

查找(总结篇)
摘要:查找表 同一类型的数据元素(或记录)构成的集合。 关键字 数据元素(或记录)中某个数据项的值,用它可以标识(识别)一个数据元素(或记录)。 主关键字 可以唯一标识一个记录的关键字叫主关键字。 次关键字 非主关键字的关键字叫次关键字。 查找操作的性能分析 在之前的算法分析中,衡量一个算法好坏的量度有三 阅读全文

posted @ 2018-08-13 18:09 lonelydeath 阅读(325) 评论(0) 推荐(0)

查找->静态查找表->顺序查找(顺序表)
摘要:文字描述 顺序查找的查找过程为:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。 示意图 略 算法分析 从顺序查找的过程看,Ci取决于所查 阅读全文

posted @ 2018-08-13 18:11 lonelydeath 阅读(1240) 评论(0) 推荐(0)

查找->静态查找表->折半查找(有序表)
摘要:文字描述 以有序表表示静态查找表时,可用折半查找算法查找指定元素。 折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或者查找区间的大小小于零时(表明查找不成功)为止。 示意图 算法分析 折半查找过程可以用一颗 阅读全文

posted @ 2018-08-15 18:12 lonelydeath 阅读(2117) 评论(0) 推荐(0)

查找->静态查找表->次优查找(静态树表)
摘要:文字描算 之前分析顺序查找和折半查找的算法性能都是在“等概率”的前提下进行的,但是如果有序表中各记录的查找概率不等呢?换句话说,概率不等的情况下,描述查找过程的判定树为何类二叉树,其查找性能最佳? 如果只考虑查找成功的情况,则使查找性能达最佳的判定树是其带权内路径长度之和PH值取最小的二叉树。 其中 阅读全文

posted @ 2018-08-15 18:20 lonelydeath 阅读(1600) 评论(0) 推荐(1)

查找->静态查找表->分块查找(索引顺序表)
摘要:文字描述 分块查找又称为索引顺序查找,是顺序查找的一种改进方法.在此查找算法中,除表本身外, 还需要建立一个”索引表”.索引表中包括两项内容:关键字项(其值为该字表内的最大关键字)和指针项(指示该子表的第一个记录在表中位置)。索引表按关键字有序,则表或者有序或者分块有序。所谓“分块有序”指的是第二个 阅读全文

posted @ 2018-08-21 18:14 lonelydeath 阅读(2595) 评论(0) 推荐(0)

查找->动态查找表->二叉排序树
摘要:文字描述 二叉排序树的定义 又称二叉查找树,英文名为Binary Sort Tree, 简称BST。它是这样一棵树:或者是一棵空树;或者是具有下列性质的二叉树:(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3 阅读全文

posted @ 2018-08-21 18:19 lonelydeath 阅读(1644) 评论(0) 推荐(0)

查找->动态查找表->平衡二叉树
摘要:文字描述 平衡二叉树(Balanced Binary Tree或Height-Balanced Tree) 因为是俄罗斯数学家G.M.Adel’son-Vel’skii和E.M.Landis在1962年提出来的,所以又称AVL树。它或者是一颗空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平 阅读全文

posted @ 2018-08-26 19:04 lonelydeath 阅读(626) 评论(0) 推荐(0)

内部排序->选择排序->简单选择排序
摘要:文字描述 简单排序的基本思想是:每一趟在n-i+1(i=1,2,…,n)个记录中选取关键字最小的记录作为有序列表中的第i个记录。 示意图 略 算法分析 简单排序算法中,所需进行记录移动的操作次数较少,其最小值为0,最大值为3(n-1)。所需进行的关键字的比较次数相同,都为n(n-1)/2。因此总的时 阅读全文

posted @ 2018-07-25 18:40 lonelydeath 阅读(447) 评论(0) 推荐(0)

内部排序->选择排序->树形选择排序
摘要:文字描述 树形选择排序又称锦标赛排序; 比如,在8个运动员中决出前3名至多需要11场比赛, 而不是7+6+5=18场比赛(它的前提是甲胜乙,乙胜丙,则甲必能胜丙) 首先对n个记录的关键字进行两两比较,然后在(n/2)个较小者之间再进行两两比较,直至选出最小关键字的记录为止,这个过程可用一颗有n个叶子 阅读全文

posted @ 2018-07-26 20:04 lonelydeath 阅读(1065) 评论(0) 推荐(0)

内部排序->选择排序->堆排序
摘要:文字描述 堆排序中,待排序数据同样可以用完全二叉树表示, 完全二叉树的所有非终端结点的值均不大于(或小于)其左、右孩子结点的值。由此,若序列{k1, k2, …, kn}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值)。 若在输出堆顶的最小值之后,使得剩余n-1个元素的序列 阅读全文

posted @ 2018-07-27 18:28 lonelydeath 阅读(574) 评论(0) 推荐(0)

内部排序->归并排序->2-路归并排序
摘要:文字描述 假设初始序列有n个记录,则可看成是n个有序的字序列,每个字序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,…, 如此重复,直到得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。 示意图 算法分析 2-路归并排序的时间复杂度为nlogn; 2 阅读全文

posted @ 2018-07-30 18:09 lonelydeath 阅读(1152) 评论(0) 推荐(0)

内部排序->基数排序->链式基数排序
摘要:文字描述 基数排序是和前面各类排序方法完全不相同,前面几篇文章介绍的排序算法的实现主要是通过关键字间的比较和移动记录这两种操作,而实现基数排序不需要进行记录关键字间的比较。基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。先介绍下什么是多关键字排序,以引入链式基数排序算法。 先介绍什 阅读全文

posted @ 2018-07-31 18:13 lonelydeath 阅读(4423) 评论(0) 推荐(1)

内部排序->其它->地址排序(地址重排算法)
摘要:文字描述 当每个记录所占空间较多,即每个记录存放的除关键字外的附加信息太大时,移动记录的时间耗费太大。此时,就可以像表插入排序、链式基数排序,以修改指针代替移动记录。但是有的排序方法,如快速排序和堆排序,无法实现表排序。这种情况下就可以进行“地址排序”,即另设一个地址向量指示相应记录的位置;同时在排 阅读全文

posted @ 2018-08-01 18:15 lonelydeath 阅读(1279) 评论(0) 推荐(0)

树和二叉树->基础知识
摘要:树的表示方法 1 一般表示法 2 广义表表示法 3 凹入表示法 树的基本术语: 树:n(n>=0)个结点的有限集 结点:包含一个数据元素及若干指向其子树的分支 结点的度:结点拥有的子树数成为结点的度 叶子(也叫终端结点):度为0的结点 非终端结点(也叫分支结点):度不为0的结点 树的度:树内各结点的 阅读全文

posted @ 2018-08-07 18:29 lonelydeath 阅读(220) 评论(0) 推荐(0)

树和二叉树->存储结构
摘要:文字描述 1 二叉树的顺序存储 用一组地址连续的存储单元自上而下,自左至右存储完全二叉树上的结点元素。 这种顺序存储只适用于完全二叉树。因为,在最坏情况下,一个深度为k且只有k个结点的单支树却需要长度为2k-1的一维数组。 2 二叉树的链式存储(二叉链表): 链表中的结点至少包含3个域:数据域,左指 阅读全文

posted @ 2018-08-07 18:33 lonelydeath 阅读(340) 评论(0) 推荐(0)

树和二叉树->相互转化
摘要:文字描述 由上篇关于树和二叉树的存储结构知,树和二叉树都可以采用二叉链表作为存储结构。也就是说,给定一颗树,可以找到惟一的一颗二叉树与之对应,从物理结构来看,它们的二叉链表是相同的,只是解释不同而已。 1 森林转换成二叉树 如果F = {T1, T2, …, Tm}是森林,需转换成一棵二叉树B={r 阅读全文

posted @ 2018-08-07 18:36 lonelydeath 阅读(336) 评论(0) 推荐(0)

树和二叉树->遍历
摘要:文字描述 二叉树的先根遍历 若二叉树为空,则空操纵,否则 (1) 访问根结点 (2) 先根遍历左子树 (3) 先根遍历右子树 二叉树的中根遍历 若二叉树为空,则空操纵,否则 (1) 中根遍历左子树 (2) 访问根结点 (3) 中根遍历右子树 二叉树的后根遍历 若二叉树为空,则空操纵,否则 (1) 后 阅读全文

posted @ 2018-08-07 18:49 lonelydeath 阅读(352) 评论(0) 推荐(0)

内部排序(总结篇)
摘要:1. 内部排序与外部排序的区别: 排序过程中涉及的存储器不同,内部排序所操作的数据都存放于内存;而外部排序所操作的数据量太大以至于不能全部放于内存,会涉及到外存访问。 2. 内部排序算法的稳定性: 待排序的数据中如果有两个相等的数据,经过排序算法之后的先后顺序依据不变的话,则称该排序方法是稳定的,否 阅读全文

posted @ 2018-07-21 13:45 lonelydeath 阅读(811) 评论(0) 推荐(0)

内部排序->插入排序->直接插入排序
摘要:文字描述: 将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表 示意图: 算法分析: 时间复杂度为n*n,辅助存储为1,是稳定的排序方法。 代码实现: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define EQ(a, b) 阅读全文

posted @ 2018-07-21 13:52 lonelydeath 阅读(484) 评论(0) 推荐(0)

内部排序->插入排序->其它插入排序->折半插入排序
摘要:文字描述 和直接插入排序比较,只是把“查找”操作利用“折半查找”来实现,由此进行的插入排序叫做折半插入排序。 示意图 略 算法分析 和直接插入排序比,减少了比较次数,但是移动次数没有变,所以折半插入排序算法的时间复杂度仍然是n*n, 辅助空间为1,是稳定的排序方法。 代码实现 1 #include 阅读全文

posted @ 2018-07-21 14:01 lonelydeath 阅读(416) 评论(0) 推荐(0)

内部排序->插入排序->其它插入排序->2-路插入排序
摘要:文字描述 在折半插入排序的基础上进行改进, 另设一个和待排序序列L相同的数组D, 首先将L[1]赋值给D[0], 数组D中数据是已经排好序的, first指向最小值下标,final指向最大值下标。初始时,first和final值都为0。之后将L的第二个元素开始依次和D[0]比较,大于D[0]的插入到 阅读全文

posted @ 2018-07-21 15:57 lonelydeath 阅读(462) 评论(0) 推荐(0)

内部排序->插入排序->其它插入排序->表插入排序
摘要:文字描述 和之前的插入排序比,表插入排序可以保证排序过程中不移动记录;因此表插入排序所用的存储结构和之前的顺序存储不同,表插入排序采用静态链表类型作为待排记录序列的存储结构,设数组中下标0的分量为表头结点,并令表头结点记录的关键字取最大整数MAXINT。表插入排序的基本操作仍然是将一个记录插入到已经 阅读全文

posted @ 2018-07-21 19:03 lonelydeath 阅读(607) 评论(0) 推荐(0)

内部排序->插入排序->希尔排序
摘要:文字描述 希尔排序又称缩小增量排序,也属于插入排序类,但在时间效率上较之前的插入排序有较大的改进。 从之前的直接插入排序的分析得知,时间复杂度为n*n, 有如下两个特点: (1)如果待排序记录本身就是“正序”时, 其时间复杂度可减少为n。 (2)当待排序记录数很小时,直接插入排序的效率也比较高; 希 阅读全文

posted @ 2018-07-25 18:27 lonelydeath 阅读(558) 评论(0) 推荐(0)

内部排序->交换排序->起泡排序
摘要:文字描述 首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(L.r[1].key>L.r[2].key),则将两个记录交换位置,然后比较第二个记录和第三个记录的关键字。依次类推,直至第n-1个记录和第n个记录的关键字进行过比较为止。上述过程称为第一趟起泡排序,其结果使得关键字最大的记录 阅读全文

posted @ 2018-07-25 18:32 lonelydeath 阅读(470) 评论(0) 推荐(0)

内部排序->交换排序->快速排序
摘要:文字描述 快速排序是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 一趟快速排序描述:假设待排序的序列为{L.r[s], L.r[s+1], … , L.r[ 阅读全文

posted @ 2018-07-25 18:36 lonelydeath 阅读(519) 评论(0) 推荐(0)