数据结构与算法
wlisonate
坚持手撸代码
展开
-
算法之折半查找
介绍折半查找,又称作二分查找。这个查找的算法的特点,就是,要求数据要是有序的。1 ,存储结构一定是顺序存储2 ,关键字大小必须有序排列算法思想:折半查找只能在有序数列中进行,将待查找的数据与有序数列(递增)中间的元素进行比较,如果相等,则找到;如果待查找的数据大于中间的元素的值,那么再从数组的后一半元素中进行查找,否则,从前一半元素中进行查找;若折半后都找不到,则输出“没找着”等提...原创 2019-05-20 22:34:42 · 1731 阅读 · 0 评论 -
数据结构之哈夫曼树以及哈夫曼编码
哈夫曼树:假设有n个权值,试着造出一棵含有n个结点的二叉树,每个叶子结点带有权值,则其中带权路径长度最小的二叉树叫哈夫曼树。1,哈夫曼树和哈夫曼编码的存储表示在这一阶段我们需要命名两个动态数组,一个存储哈夫曼树,一个存储哈夫曼编码表typedef struct huffNode{ unsigned int weight; //权重 unsigned int...原创 2019-04-18 20:18:30 · 2117 阅读 · 0 评论 -
数据结构之图的创建(邻接表法创建)
邻接表是图的一种链式存储结构。在邻接表中,对图的每个顶点建立一个单链表,第I个单链表的结点依附于顶点V的边。邻接表的存储结构个人感觉邻接表的难点在于创建三种结构体,并将他们三个联系起来,过程中多了很多名词,需要大家细心去领会,还有就是在创建边表的时候需要进行头插法,以保证最大的在最前面 。邻接表中三个结构体的创建typedef struct EdgeNode{ int...原创 2019-04-22 20:57:38 · 6840 阅读 · 2 评论 -
数据结构之图(邻接矩阵创建)
邻接矩阵 邻接矩阵的存储方式是用两个数组表示图。一个一维数组存储图中顶点信息。一个二维数组(邻接矩阵)存储图中的边或弧的信息。无向图的邻接矩阵特点: 1、很容易判断任意两个顶点是否有边无边。 2、想要知道某个顶点的度,其实就是这个点点 Vi 在邻接矩阵中第 i 行(或第 i 列)的元素之和。 3、求顶点 V...原创 2019-04-23 20:48:21 · 3971 阅读 · 0 评论 -
数据结构之最小生成树(Prim算法)
最小生成树问题是实际生产生活中十分重要的一类问题。假设需要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时,自然需要考虑这样一个问题,即如何在最节省经费的前提下建立这个通信网。可以用连通网来表示n个城市以及n个城市之间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可...原创 2019-04-29 12:08:13 · 7697 阅读 · 0 评论 -
数据结构之拓扑排序(邻接矩阵)
由某个集合上的一个偏序得到该集合上的一个全序,这个操作被称为拓扑排序。偏序和全序的定义分别如下:若集合X上的关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。设R是集合X上的偏序,如果对每个x,y∈X必有xRy或yRx,则称R是集合X上的全序关系。由偏序定义得到拓扑有序的操作便是拓扑排序。拓扑排序的流程如下:1. 在有向图中选一个没有前驱的顶点并且输出之...原创 2019-04-29 21:54:09 · 5902 阅读 · 3 评论 -
数据结构之关键路径(邻接表):详细阐述每一步
关键路径与AOV-网相对应的时AOE-网即边表示活动的网。AOE-网时一个带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动的时间。通常,AOE-网可用来估算工程的完成时间。如图:一个AOE-网由于在AOE-网中只有一个开始点和一个完成点,故在正常的情况下(无环)下,网中只有一个入度为零的顶点和一个出度为零的顶点。接下来进入正题,神魔是关键路径:路径最长的路径叫关键路径...原创 2019-05-04 14:59:05 · 1983 阅读 · 0 评论 -
数据结构之最短路径(迪杰斯特拉算法和弗洛伊德算法 )
1.在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题。在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次序产生最短路径的算法。单源点的最短路径问题:给定带权有向图G和源点v,求从v到G中其余各顶点的最短路径。我们用一个例子来具体说明迪杰斯特拉算法的流程。定义源点为 0,dist[i]为源点 ...原创 2019-05-05 20:48:53 · 9076 阅读 · 1 评论 -
冒泡排序和选择排序及其他们的优化
1.冒泡排序冒泡排序(BubbleSort),又被称为气泡排序或泡沫排序。它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾!采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!普通的冒泡排序...原创 2019-05-06 22:43:38 · 593 阅读 · 2 评论 -
鸡尾酒排序(小博学习排序第二天)
鸡尾酒排序冒泡排序的每一个元素就像小气泡一样,根据自身大小,一点一点的向数组的一侧移动,算法的每一轮都是从左到右比较元素,进行单向位置的交换的。那么鸡尾酒排序做了怎样的优化呢?鸡尾酒的元素比较和交换过程都是双向的如图:是冒泡排序的过程冒泡排序的过程 2 3 4 5 6 7 1 8 2 3 4 5 6...原创 2019-05-07 16:20:28 · 239 阅读 · 4 评论 -
快速排序(双边扫描和单边扫描)(小博的第三天)
同冒泡排序一样,快速排序也属于交换排序,通过交换元素之间的位置来达到排序的目的。不同的是,冒泡排序在每一轮中只把1个元素冒泡到数列的一端,而快速排序则在每一轮挑选一个基准元素,并让比他大的元素移动到数列一边,比他小的移到数列的另一边,从而把数列拆解成两个部分。这种思路就叫做分治法。快速排序的好处:假如给出一个8个元素的数列,一般情况下,使用冒泡排序需要比较7轮,每一轮把一个元素移动到数列的...原创 2019-05-09 23:02:23 · 1493 阅读 · 0 评论 -
堆排序和插入排序(小博学习排序第四天)
1,堆排序堆排序的算法步骤;把无序数组构建成一个二叉堆,需要从小到大排序,则构建最大堆;需要从大到小排序,则构建小顶堆。 循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。下来我们讲解他的实现过程构造堆将无序数组构造成一个大根堆(升序用大根堆,降序就用小根堆)假设存在以下数组主要思路:第一次保证0~0位置大根堆结构(废话),第二次保证0~1位置大根堆结构,第...原创 2019-05-15 22:04:34 · 667 阅读 · 0 评论 -
归并排序和计数排序以及计数排序的优化(小博学习算法第五天)
1,计数排序计数排序是特殊的排序,这种排序不需要进行元素比较,对于计数排序而言,该排序算法是利用数组下标来确定元素的位置的。 让我们来看一个例子 假设数组中有20个随机整数,取值范围是0-10,要求利用最快速度把20个数进行从小到大排序。如何给这些无序的数组排序呢?考虑到这些数只能够在1,2,3,4,5,6,7,8,9,10这11个数中取值,可以根据此,建立一个长度为11的数...原创 2019-05-16 22:42:41 · 389 阅读 · 0 评论 -
数据结构之二叉树的递归与非递归遍历
一、二叉树在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构。二叉树是每个节点最多有两个子树的有序树。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。值得注意的是,二叉树不是树的特殊情形。在图论中,二叉树是一个连通的无环图,并且每一个顶点的度不大于3。...原创 2019-04-16 21:09:31 · 693 阅读 · 0 评论