数据结构
数据结构
有人_295
学习使人进步
展开
-
桶排序算法——C/C++
桶排序1. 算法思想桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。个人理解,适合数据比较集中排序,桶的数量适当设置。2. 实现原理桶排序以下列程序进行:设置一个定量的数组当作空桶子。寻访序列,并且把项目一个一个放到对应的桶子去。对每个不是空的桶子进行排序。从不是空的桶子里把项目再放回原来的序列中。3. 动态演示(1)数据分桶(2)桶内数据排原创 2020-12-03 22:38:07 · 5812 阅读 · 3 评论 -
红黑树——C/C++
红黑树由于红黑树本质上就是一棵二叉查找树,所以在了解红黑树之前,咱们先来看下二叉查找树。1. 二叉查找树二叉查找树(Binary Search Tree),是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值任意节点的左、右子树也分别为二叉查找树没有键值相等的节点(no duplicate nodes)2. 红黑树R-B Tree,全称是Red-Black Tree,又翻译 2020-11-08 12:39:37 · 696 阅读 · 0 评论 -
(树)搜索算法——C/C++
用树做一个类似搜索的程序。一、分析有大量的信息(关键字:描述),需要在大量的信息当中搜索想要的信息:(1)如果用全部检索(遍历)方法搜索关键字,无疑会浪费时间和资源;(2)如果用树构建一个搜索树,层层搜索关键字(的一个字母),搜索到后就是需要的描述,就会节约很多时间。二、算法思想创建一个结构体,有关于关键字指针的数组,还有信息对应的描述。typedef struct search_t...原创 2020-04-24 15:26:48 · 1320 阅读 · 0 评论 -
AVL平衡二叉树——C/C++
这个网上有很多讲解,我就大概记录下自己个人的理解。一、平衡二叉树1、定义平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法)。且具有以下可以是空树假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过 12、为什么要平衡二叉树(1)优点这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂...原创 2020-04-22 18:29:52 · 930 阅读 · 3 评论 -
图的遍历(深度、广度)——C/C++
图的基础:https://blog.csdn.net/weixin_42109012/article/details/94140343队列基础:https://blog.csdn.net/weixin_42109012/article/details/92104948例子:一、深度优先遍历1、算法思想(1)从图中的某个初始点 v 出发,首先访问初始点 v.(2)选择一个与顶点 v 相...原创 2019-06-30 23:47:52 · 15528 阅读 · 2 评论 -
图的Dijkstra算法——C/C++
例子:一、算法原理1.首先,引入一个辅助向量 dist[],它的每个分量 dist[] 表示当前所找到的,从起始点(即源点)到其它每个顶点的长度。例如,dist[6] = 16表示从起始点到顶点3的路径相对最小长度为2。这里强调相对就是说在算法执行过程中 dist[] 的值是在不断逼近最终结果但在过程中不一定就等于长度。2.dist[] 的初始状态为0:若从 v 到 vj 有边,则 d...原创 2019-06-30 23:47:30 · 789 阅读 · 6 评论 -
图的Floyd算法——C/C++
例子:一、算法原理通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。从图的带权邻接矩阵A=[a(i,j)],n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还...原创 2019-06-29 22:37:08 · 5281 阅读 · 0 评论 -
单链表基本运算算法——C/C++
1、简介单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。2、格式data域--存放结点值的数据域next域--存放结点的直接后继的地址(位置)的指针域(链域)链表通过每个结点的链域将线性表的n...原创 2019-08-22 15:44:39 · 3833 阅读 · 0 评论 -
栈的基本运算算法——C/C++
1、简介栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。2、图示3、各个函数接口//初始化void InitStac...原创 2019-08-22 16:30:11 · 3647 阅读 · 0 评论 -
图的基本运算算法(基于邻接表)——C/C++
一、概念图(Graph)结构是一种非线性的数据结构,图在实际生活中有很多例子,比如交通运输网,地铁网络,社交网络,计算机中的状态执行(自动机)等等都可以抽象成图结构。图结构比树结构复杂的非线性结构。图结构构成1.顶点(vertex):图中的数据元素。2.边(edge):图中连接这些顶点的线。所有的顶点构成一个顶点集合,所有的边构成边的集合,一个完整的图结构就是由顶点集合和边集合组成。图...原创 2019-06-29 13:27:23 · 4437 阅读 · 0 评论 -
直接选择排序算法——C/C++
直接选择排序1、算法思想选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。2、排序步骤2.1、默认下标最小的为开始数据,记录下标key。2.2、从第二个数据开始排序,进行数据比较,如果a...原创 2019-06-12 11:02:55 · 1658 阅读 · 4 评论 -
快速排序算法——C/C++
快速排序1、算法思想快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。2、实现原理2.1、设置两个变量 low、high,排序开始时:low=0,high=size-1。2.2、整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面...原创 2019-06-12 22:55:14 · 247942 阅读 · 53 评论 -
堆排序算法——C/C++
堆排序1、算法思想堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。2、实现原理要实现从小到大的排序,就要建立大顶堆,即父节点比子节点都要大。2.1、初始化数组,创建大顶堆。大顶堆的创建从下往上比较,不能直接用无序数组从根节点比较,否则有的不符合大顶堆的定义。...原创 2019-06-13 00:34:07 · 61833 阅读 · 37 评论 -
二叉树基本运算算法——C/C++
二叉树1、基本介绍在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树是链式存储结构,用的是二叉链,本质上是链表。2、二叉树的二叉链介绍二叉链节点类型BTNode声明struct node 是链表类型定义。BTNode 是typed...原创 2019-06-14 20:33:57 · 10577 阅读 · 4 评论 -
顺序队基本运算算法——C/C++
队列1、简介队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,...原创 2019-06-15 16:54:32 · 2454 阅读 · 0 评论 -
二叉树层次遍历算法——C/C++
二叉树层序遍历1、算法思想用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。在进行层次遍历的时候,设置一个队列结构,遍历从二叉树的根节点开始,首先将根节点指针入队列,然后从队头取出一个元素,每取一个元素,执行下面两个操作:访问该元素所指向的节点若该元素所指节点的左右孩子节点非空,则将该元素所指节点的左孩子指针和右孩子指针顺序入队。此过程不断进行,当队列为空时,二叉树的层次遍历结束...原创 2019-06-16 00:32:47 · 89666 阅读 · 31 评论 -
哈夫曼算法——C/C++
哈夫曼1、简介哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1L1+W2L2+W3L3+…+WnLn),N个权值Wi(i=1,2,…n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,…n)。可...原创 2019-06-16 22:57:22 · 5885 阅读 · 8 评论 -
直接插入排序算法——C/C++
直接插入排序1、插入排序(Insertion-Sort)的基本思想:每次将一个待排序的数据按照大小插入到前面已经排好序的适当位置,直到全部数据插入完成为止。2、插入排序的步骤:2.1、建立一个哨兵(即临时变量),把要插入的数据赋给它。2.2、插入数据从后面开始比较,如果大于前面的就记录下标,并将数据后移,直到插入数据碰到比它小的。2.3、将临时变量赋值给当前记录下标。2.4、for循...原创 2019-06-11 23:16:00 · 61039 阅读 · 9 评论 -
希尔排序算法——C/C++
希尔排序1、希尔排序算法思想希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所...原创 2019-06-11 23:42:10 · 793 阅读 · 1 评论 -
冒泡排序算法——C/C++
冒泡排序1、算法思想冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。2、排序步骤2.1、默认认为原数据为无序的。2.2、从第二个数据开始排序,进行数据比较,如果array[i]>...原创 2019-06-12 10:28:37 · 4143 阅读 · 1 评论 -
归并排序算法(二路)——C/C++
归并排序(二路)1、算法思想归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列...原创 2019-06-12 17:59:32 · 29827 阅读 · 5 评论