数据结构+算法
挖坑埋你
这个作者很懒,什么都没留下…
展开
-
排序算法 | 冒泡排序算法原理及实现和优化
冒泡排序(Bubble Sort)是排序算法里面比较简单的一个排序。它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。冒泡排序的原理为了更深入地理解冒泡排序的操作步骤,我们现在看一下冒泡排序的原理。首先我们肯定有一个数组,里面存放着待排序的元素列表,我们如果需要把比较大的元素排在前面,把小的元素排在后面,那么需要...转载 2018-10-22 09:41:53 · 489 阅读 · 0 评论 -
查找算法 | 红黑树详细分析
1 红黑树简介红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1978年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。因此,红黑...转载 2018-10-30 09:57:18 · 1303 阅读 · 1 评论 -
查找算法 | B-树详细分析
什么是B-树?1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树(或多路查找树),称为 B树。B树,有时又写为B-树或B_树(其中的“-”或者“_”只是连字符,并不读作“B减树”),一颗 m 阶的 B树是一棵平衡的 m 路搜索树。它或者是空树,或者是满足下列性质的树:若根结点不是叶子结点(那种情况只能是整个树就一个根节点),则至少有两棵子树...原创 2018-10-30 16:17:02 · 2551 阅读 · 0 评论 -
查找算法 | 平衡二叉树(AVL树)详细分析
AVL:完全平衡的二叉查找树二叉查找树可以表示动态的数据集合,对于给定的数据集合,在建立一颗二叉查找树时,二叉查找树的结构形态与关键字的插入顺序有关。如果全部或者部分地按照关键字的递增或者递减顺序插入二叉查找树的结点,则所建立的二叉查找树全部或者在局部形成退化的单分支结构。在最坏的情况下,二叉查找树可能完全偏斜,高度为n,其平均与最坏的情况下查找时间都是O(n);而最好的情况下,二叉查找树的结...原创 2018-11-01 11:35:54 · 5597 阅读 · 0 评论 -
查找算法 | B+树详细分析
在阅读本篇博客前请先阅读《数据结构和算法 | B-树详细分析》B+树是由B树变来的,B+树和B树有这样的区别:B+树的非叶子节点不记录数据本身,只记录引用的连接,并且结点中仅含有其子树中的最大(或最小)关键字。基于此特点,B+树在非叶子节点的文件会非常小;B+树的所有的叶子结点中包含了全部关键字的信息;B+树的每个叶子节点都有指向相邻的下一个兄弟叶子节点的指针且叶子结点本身依关键字的...原创 2018-10-30 20:59:05 · 2527 阅读 · 0 评论 -
图 | 存储结构:邻接表、邻接多重表、十字链表及C语言实现
上一节介绍了如何使用顺序存储结构存储图,而在实际应用中最常用的是本节所介绍的链式存储结构:图中每个顶点作为链表中的结点,结点的构成分为数据域和指针域,数据域存储图中各顶点中存储的数据,而指针域负责表示顶点之间的关联。使用链式存储结构表示图的常用方法有 3 种:邻接表、邻接多重表和十字链表。邻接的意思是顶点之间有边或者弧存在,通过当前顶点,可以直接找到下一个顶点。邻接表使用邻接表存...转载 2018-11-06 17:24:45 · 1755 阅读 · 0 评论 -
查找算法 | 静态树表(次优查找树)详细分析
前面章节所介绍的有关在静态查找表中对特定关键字进行顺序查找、折半查找或者分块查找,都是在查找表中各关键字被查找概率相同的前提下进行的。例如查找表中有 n 个关键字,表中每个关键字被查找的概率都是 1/n。在等概率的情况,使用折半查找算法的性能最优。而在某些情况下,查找表中各关键字被查找的概率是不同的。例如水果商店中有很多种水果,对于不同的顾客来说,由于口味不同,各种水果可能被选择的概率是不...原创 2018-11-04 11:36:05 · 9519 阅读 · 2 评论 -
图 | 两种遍历方式:深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)
前边介绍了有关图的 4 种存储方式,本节介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种:深度优先搜索和广度优先搜索。深度优先搜索(简称“深搜”或DFS)图 1 无向图深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为:首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过...转载 2018-11-07 10:52:54 · 3564 阅读 · 0 评论 -
图 | 深度优先生成树和广度优先生成树
本章的第一节中,介绍了有关生成树和生成森林的有关知识,本节来解决对于给定的无向图,如何构建它们相对应的生成树或者生成森林。其实在对无向图进行遍历的时候,遍历过程中所经历过的图中的顶点和边的组合,就是图的生成树或者生成森林。图 1 无向图例如,图 1 中的无向图是由 V1~V7 的顶点和编号分别为 a~i 的边组成。当使用深度优先搜索算法时,假设 V1 作为遍历的起始点,涉及到的顶点和...转载 2018-11-07 17:52:40 · 47421 阅读 · 0 评论 -
查找算法 | 键树详细分析
键树,又称数字查找树(Digital Search Trees),是一棵度>=2的树,它的某个节点不是包含一个或多个关键字,而是只包含组成关键字的一部分(字符或数字)。如果关键字本身是字符串,则键树中的一个结点只包含有一个字符;如果关键字本身是数字,则键树中的一个结点只包含一个数位。每个关键字都是从键树的根结点到叶子结点中经过的所有结点中存储的组合。根结点不代表任何字符,根以下第一层...原创 2018-10-31 16:57:56 · 1342 阅读 · 0 评论 -
排序算法 | 基数排序算法原理及实现和优化
基数排序不同于之前所介绍的各类排序,前边介绍到的排序方法或多或少的是通过使用比较和移动记录来实现排序,而基数排序的实现不需要进行对关键字的比较,只需要对关键字进行“分配”与“收集”两种操作即可完成。基数排序的原理例如对无序表 {50,123,543,187,49,30,0,2,11,100} 进行基数排序,由于每个关键字都是整数数值,且其中的最大值由个位、十位和百位构成,每个数位上的数字从 ...转载 2018-10-26 11:19:11 · 1543 阅读 · 0 评论 -
排序算法 | 简单选择排序算法原理及实现和优化
选择排序是一种非常简单的排序算法,就是在序列中依次选择最大(或者最小)的数,并将其放到待排序的数列的起始位置。简单选择排序的原理简单选择排序的原理非常简单,即在待排序的数列中寻找最大(或者最小)的一个数,与第 1 个元素进行交换,接着在剩余的待排序的数列中继续找最大(最小)的一个数,与第 2 个元素交换。以此类推,一直到待排序的数列中只有一个元素时为止。也就是说,简单选择排序可分为两部分,...转载 2018-10-22 15:45:34 · 3083 阅读 · 0 评论 -
排序算法 | 堆排序算法原理及实现和优化
在学习堆排序之前,首先需要了解堆的含义:在含有 n 个元素的序列中,如果序列中的元素满足下面其中一种关系时,此序列可以称之为堆。ki ≤ k2i 且 ki ≤ k2i+1(在 n 个记录的范围内,第 i 个关键字的值小于第 2i 个关键字,同时也小于第 2i+1 个关键字)ki ≥ k2i 且 ki ≥ k2i+1(在 n 个记录的范围内,第 i 个关键字的值大于第 2i 个关键字,同时也大...原创 2018-10-25 10:10:58 · 608 阅读 · 0 评论 -
排序算法 | 插入排序算法原理及实现和优化
插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。直接插入排序是插入排序算法中的一种,采用的方法是:在添加新的记录时,使用顺序查找的方式找到其要插入的位置,然后将新记录插入。很多初学者所说的插入排序,实际上指的就是直接插入排序算法,插入排序算法还包括折半插入排序、2-路插入排序,表插入排序和希尔...转载 2018-10-23 10:01:12 · 5634 阅读 · 0 评论 -
排序算法 | 希尔排序算法原理及实现和优化
希尔排序也是一种插入排序算法,也叫作缩小增量排序,是直接插入排序的一种更高效的改进算法。希尔排序因其设计者希尔(Donald Shell)的名字而得名,该算法在 1959 年被公布。一些老版本的教科书和参考手册把该算法命名为 Shell-Metzner,包含了 Marlene Metzner Norton 的名字,但是 Metzner 说:“我没有为这种算法做任何事,我的名字不应该出现在这个算法...转载 2018-10-23 11:16:20 · 1834 阅读 · 0 评论 -
排序算法 | 归并排序算法原理及实现和优化
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。归并排序的原理归并排序的实现思想是:先将所有的记录完全分开,然后两两合并,在合并的过程中将其排好序并且将已有序的子序列合并,最终能够得到一个完整的有序表。例...转载 2018-10-23 13:25:22 · 989 阅读 · 0 评论 -
排序算法 | 快速排序算法原理及实现和优化(一)
快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出。快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。快速排序的原理排序算法的思想非常...转载 2018-10-23 15:45:24 · 3043 阅读 · 0 评论 -
排序算法 | 快速排序算法原理及实现和优化(二)
接上文《数据结构和算法 | 快速排序算法原理及实现和优化(一)》,我们来讲讲快速排序的五种优化方案。1、优化选取基准点三数取中法:先找出三个关键字,然后排序,取中间的关键字(至少不会是两个极端)。在代码示例中我们选取相应区间的开始元素、中间元素和末尾元素。按照所选取的基准点的顺序可以构造一颗顺序二叉树。二叉树的深度就是递归的深度。二叉树的平衡性越好,算法的性能越好。2、优化不必要的交...原创 2018-10-23 18:03:53 · 401 阅读 · 0 评论 -
排序算法 | 桶排序算法原理及实现和优化
排序充斥着我们的生活,比如站队、排队买票、考试排名、公司业绩排名、将电子邮件按时间排序、QQ 好友列表中的会员红名靠前,等等。这里先举个例子,通过这个例子让我们接触第 1 个算法。在某个期末考试中,老师要把大家的分数排序,比如有 5 个学生,分别考 5、9、5、1、6 分(满分 10 分),从大到小排序应该是 9、6、5、5、1,大家有没有办法写一段程序随机读取 5 个数,然后对它们排序呢?...原创 2018-10-26 09:58:52 · 5280 阅读 · 0 评论 -
图 | 存储结构:邻接矩阵及C语言实现
使用图结构表示的数据元素之间虽然具有“多对多”的关系,但是同样可以采用顺序存储,也就是使用数组有效地存储图。邻接矩阵邻接矩阵(Adjacency Matrix),又称 数组表示法,存储方式是用两个数组来表示图:一个一维数组存储图中顶点本身信息;一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。存储图中各顶点本身信息,使用一维数组就足够了;存储顶点之间的关系(边或弧)时,要记...原创 2018-11-05 17:37:48 · 7986 阅读 · 0 评论