数据结构
地狱天神
这个作者很懒,什么都没留下…
展开
-
c++排序part1: 冒泡、选择、插入排序
1.冒泡排序: 正所谓人如其名,冒泡排序正是使用了“冒泡”的方法对元素进行了排序。 它的算法思想就是在每次遍历的时候从头到尾比较相邻的两个元素大小,将较小的元素“冒”到前面来,把最大的元素移向队尾,使得元素变得有序。 我们把已经排好序的区域称为有序区,相对应的便是没排好顺序的无序区了。 那么冒泡排序大致可以分为两类,一类是每次遍历的时候将较小的元素“冒”到前面来,把最小的元素移转载 2014-09-24 21:16:38 · 477 阅读 · 0 评论 -
图解数据结构(5)——散列法及哈希表
图解数据结构(5)——散列法及哈希表 七、哈希表(Hash Table)及散列法(Hashing) 数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法,我们可以理解为“链表的数转载 2015-03-19 15:33:52 · 396 阅读 · 0 评论 -
图解数据结构(4)——二分法查找法
图解数据结构(4)——二分法查找法 六、二分法查找(Binary Search) 如何从数组里找一个元素的位置?如果排列是无序的,我们只能从头到尾找,但如果排列是有序的,我们则可以用别的更好的方法,二分查找法就类似我们在英汉词典里找一个单词的方法。如下图所示(假如我们要查找的数字是“88”): 下面我给出了一段demo代码,来演示二分查找法比顺序查找快多少,代码为了方便起见,初始化有转载 2015-03-19 15:34:51 · 450 阅读 · 0 评论 -
树和图的遍历
(一)用栈前序遍历树 对这篇文章的来源性说明:理论和代码来源,《系统设计师教程》(王春森主编),文章内容来自我对书中代码的分析和手工注释。 ( 本文献给小师妹:littlehead(我是大好人)) 名词:栈,遍历,前序遍历,树。 (1)准备:树的定义省略。但是由于数的定义属于递归型定义,即树的每个子节点又是一棵树,所以这个递归型的定义使对树的很多操作通常都可以用递归算转载 2015-03-19 15:28:09 · 763 阅读 · 0 评论 -
图解数据结构(3)——队
图解数据结构(3)——队 五、队(Queue) 前一篇讲了栈(Stack),队和栈其实只有一个差别,栈是先进后出,队是先进先出,如图: 从图中可以看出,队有两个常用的方法,Enqueue和Dequeue,顾名思义,就是进队和出队了。队和栈一样,既可以用数组实现,也可以用链表实现,我还是偏向于用数组,我的实现示意图如下: 队有啥用呢?一个最常用的用途就是“buffer”,即缓冲区转载 2015-03-19 15:32:36 · 293 阅读 · 0 评论 -
图解数据结构(9)——左偏树
图解数据结构(9)——左偏树 十三、左偏树(Leftist Tree) 树这个数据结构内容真的很多,上一节所讲的二叉堆,其实就是一颗二叉树,这次讲的左偏树(又叫“左翼堆”),也是树。 二叉堆是个很不错的数据结构,因为它非常便于理解,而且仅仅用了一个数组,不会造成额外空间的浪费,但它有个缺点,那就是很难合并两个二叉堆,对于“合并”,“拆分”这种操作,我觉得最方面的还是依靠指针,改变一下指针转载 2015-03-19 15:37:25 · 382 阅读 · 0 评论 -
图解数据结构(7)——二叉查找树及平衡二叉查找树
图解数据结构(7)——二叉查找树及平衡二叉查找树 这篇将是最有难度和挑战性的一篇,做好心理准备! 十、二叉查找树(BST) 前一篇介绍了树,却未介绍树有什么用。但就算我不说,你也能想得到,看我们Windows的目录结构,其实就是树形的,一个典型的分类应用。当然除了分类,树还有别的作用,我们可以利用树建立一个非常便于查找取值又非常便于插入删除的数据结构,这就是马上要提到的二叉查找树(Bin转载 2015-03-19 15:35:40 · 332 阅读 · 0 评论 -
图解数据结构(2)——栈
图解数据结构(2)——栈 四、栈(Stack) 前一篇讲解了最基本的东西,这篇就稍微前进一点点,讲一下栈,栈在英文中叫Stack,翻译成中文又叫“堆栈”,但决不能称为“堆”,这个要搞清楚,我们说的“栈”和“堆栈”指的都是Stack这种数据结构,但“堆”却是另外一个概念了,这里且不提。 栈最大特点是先进后出,如图: 可以看出,栈有几个最常见的方法,或者说必备的转载 2015-03-19 15:31:10 · 391 阅读 · 0 评论 -
二叉树的深度优先遍历和广度优先遍历
深度优先搜索算法(Depth First Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。 如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。 如右图所示的转载 2015-03-19 15:26:29 · 337 阅读 · 0 评论 -
二叉树遍历
树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。 二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个结点;转载 2015-03-19 15:23:34 · 349 阅读 · 0 评论 -
图解数据结构(1)——大圈表示法、动态数组和单向链表
《数据结构》这门课是计算机专业的核心课程,但往往却让人头痛,因为比较抽象,当然了,也许你足够聪明,并不觉得它有多难,但对我而言,是有点难度,后来我仔细想了想,到底哪里难?我得出这么个结论:长篇大论,缺乏图表。现在的人都喜欢看电影,看电视剧,很少人还热衷于看小说吧,密密麻麻的文字不如一些图来得直观。 另外,我们大多数人是做应用的,不是做研究的,所以我们只需要知道2+3=5,而不需要知道a+b=转载 2015-03-19 15:30:15 · 398 阅读 · 0 评论 -
图解数据结构(8)——二叉堆
图解数据结构(8)——二叉堆 十二、二叉堆(Binary Heap) 经历了上一篇实现AVL树的繁琐,这篇就显得非常easy了。 首先说说数据结构概念——堆(Heap),其实也没什么大不了,简单地说就是一种有序队列而已,普通的队列是先入先出,而二叉堆是:最小先出。 这不是很简单么?如果这个队列是用数组实现的话那用打擂台的方式从头到尾找一遍,把最小的拿出来不就行了?行啊,可是出队的操作是转载 2015-03-19 15:37:53 · 387 阅读 · 0 评论 -
c++排序part2:堆排序、快速排序、归并排序
4.堆排序 简单来说,最大堆就是一个从上而下的每一层都满足从大到小顺序的完全二叉树。 那么最简单的堆排序就是每次取出堆顶元素,并且保持剩下的元素依旧构成一个最大堆,就可以实现堆排序了。具体的相关操作参考连接的博文内容。 所以堆排序的排序方法非常简单,因为重点在堆结构的操作上。源码如下: [cpp] view plaincopy转载 2014-09-24 21:17:33 · 507 阅读 · 0 评论 -
B树、B-树、B+树、B*树
B树 具体讲解之前,有一点,再次强调下:B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是一种一种树。而事实上是,B-tree就是指的B树。特此说明。 我们知道,B 树是为了磁盘或其它存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有转载 2014-09-24 21:14:03 · 473 阅读 · 0 评论 -
十大编程算法
算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比 较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构 上很有效率地被实现出来。 快速排序使用分治法(Divide and conqu转载 2014-09-24 21:19:27 · 389 阅读 · 0 评论 -
c++排序part3:箱子排序、基数排序、排序比较
7.箱子排序 说明一点,箱排序实用价值不大,在此仅适用于作为基数排序的一个中间步骤,所以有必要介绍一下。 我们先来看一个场景需求: 数据库中存储了学生的姓名年龄和成绩,要求将学生按照成绩排序。如果是前面的几种简单排序,所需要花费的时间均为N方,所以介绍一种更快的排序算法:箱子排序。 简单点说,箱子排序就是把待排序元素分成几类,然后设置若干个箱子,依次扫描待排序的记录,把关键转载 2014-09-24 21:18:25 · 1558 阅读 · 0 评论 -
图解数据结构(6)——树及树的遍历
八、树(Tree) 树,顾名思义,长得像一棵树,不过通常我们画成一棵倒过来的树,根在上,叶在下。不说那么多了,图一看就懂: 当然了,引入了树之后,就不得不引入树的一些概念,这些概念我照样尽量用图,谁会记那么多文字? 树这种结构还可以表示成下面这种方式,可见树用来描述包含关系是很不错的,但这种包含关系不得出现交叉重叠区域,否则就不能用树描述了,看图: 面试的时候我们经转载 2015-03-19 15:36:09 · 345 阅读 · 0 评论