算法与数据结构
文章平均质量分 83
arge129
这个作者很懒,什么都没留下…
展开
-
有意思的排序算法-插入排序
所谓排序,无非就是把一个无序的序列排成一个有序的序列,从本文开始,将着重介绍经典的一些排序算法。 插入排序,是指将待排序列中的数,一个一个插入到适当位置的过程。说起算法的概念来,总是让人摸不着头脑,还是从生活中的例子来理解吧。相信每个人都玩过牌,我们在开始摸牌的时候,左手是空的,牌面朝下放到桌子上,接着,一次从桌子上摸起一张牌,并将它插入到左手一把牌中的正确位置上,为了找到这张牌的正原创 2012-05-12 10:44:54 · 253 阅读 · 0 评论 -
白话红黑树系列之二——红黑树的构建
上一篇写了关于红黑树基本性质的东西,这篇来说一说如何创建一棵红黑树吧。 如果对红黑树的基本性质还有疑问,请先查看一下我的前一篇:http://blog.csdn.net/arge129/article/details/7572687。 红黑树是一种二叉查找树,那么我们可以使用插入的方法来创建一棵红黑树,为此,我们先来介绍关于红黑树的一些基本操作。 1. 旋转 旋转是一种能保原创 2012-05-16 20:21:09 · 3341 阅读 · 0 评论 -
二叉查找树(五)
接上一篇,继续讲二叉查找树的操作,之前的博客都讲得差不多了,本篇就讲一下删除操作,以及求最矮公共父结点(LCA:lowest common ancestor)的操作吧。删除 将一个结点从二叉查找树中删除之后,剩下的结点可能会不满足二叉查找树的性质,因此,在删除结点之后要对树进行调整,使其满足二叉查找树的性质。根据结点的孩子的数量,将删除操作分为三种情况,我们记要删除的结点为z,实际上原创 2012-05-12 11:04:40 · 870 阅读 · 2 评论 -
二叉查找树(四)
接上一篇,让我们来继续讨论二叉查找树的基本操作,需要注意的一点是,上篇中的遍历操作是针对任意一棵二叉树都可以的,凡是没提及需要二叉查找树性质的地方,应该都是满足二叉树的操作。上篇主要讨论了二叉树的遍历操作,这篇,我们来讨论二叉查找树的查找、求最大最小值以及求前驱和后继等操作。查找 二叉查找树的查找操作可以在O(h)时间内完成,其中h为树的高度。查找的算法很简单,根据二叉查找树的性质,原创 2012-05-12 11:03:05 · 562 阅读 · 0 评论 -
二叉查找树(三)
我们知道二叉查找树是一种数据结构,它支持多种动态集合的操作,包括:查询,最大值,最小值,前驱,后继,插入和删除等操作。那么我们在前一篇已经创建了二叉查找树,那么我们来实现二叉查找树的各种操作吧。(*^__^*) (以下纯属个人理解,个人原创,理解不当的地方,请指正,谢谢) 我们来看二叉树的遍历操作,所谓遍历,顾名思义,就是能够依次的访问二叉查找树中的各个结点。在数据结构课堂上,我们知道,遍历原创 2012-05-12 11:01:51 · 659 阅读 · 0 评论 -
二叉查找树(二)
在上一篇中,我们说到了二叉树的性质,存储以及定义的结点,有了这些之后,我们便可以来创建一棵二叉查找树了。 首先,我们知道,按照我们定义的存储结构,如果我们知道了整棵树的根结点,那么我们就可以访问到整棵树的所有结点了,因此,将二叉树的类写成如下形式: 1 /** 2 * 二叉查找树 3 * @author Alfred 4 */ 5 public class BSTree原创 2012-05-12 11:00:57 · 561 阅读 · 1 评论 -
选择实现—简单工厂
之前写了好多关于排序算法的文章,基本上都是总结性质的,其实排序算法的研究很细致,但是我的博客都基本上只是给出了大体的思路和Java程序实现,算法写起来比较繁琐,感兴趣的话,自己去研究下吧,我推荐算法导论这本书。 看到这么多的排序算法,如果要将其真正用到Java程序里边的话,未免也太复杂了,因为要为每一种算法在使用之前都要先创建一个实例,然后才能使用,这样就暴露了实现,不符合面向对象的基本要求原创 2012-05-12 10:55:39 · 334 阅读 · 0 评论 -
有意思的排序算法-快速排序
快速排序对于含有n个元素的数组,最坏情况的运行时间为O(n2),虽然这个最坏情况的运行时间比较差,但是快速排序通常是用于排序的最佳的实用选择,这是因为其平均性能相当好,而且我们可以采用随机化的快速排序算法,来减少出现最坏情况的机会,其期望运行时间为O(nlgn),而且该记号中含的常数因子很小。 像合并排序算法一样,快速排序也是基于分治法进行排序的。其排序过程分为三个步骤: 分解:数组A原创 2012-05-12 10:50:14 · 332 阅读 · 0 评论 -
二叉查找树(一)
一个二叉查找树是按照二叉树的结构来组织的,不熟悉二叉树的童鞋请查下资料,这里不多讲了。先来讲一下二叉查找树的性质吧。二叉查找树的性质 用比较通俗易懂的语言来描述一下就是,二叉查找树的左子树上的结点不比父结点大,右子树上的结点不比父结点小,即,设x为二叉查找树中的一个结点,如果y是x的左子树中的一个结点,则key[y] 知道了二叉查找树的性质,我们就可以来编程了,但是在这之前我们原创 2012-05-12 10:59:42 · 850 阅读 · 1 评论 -
有意思的排序算法-堆排序
堆排序,是一个非常优秀的排序算法,像合并排序而不像插入排序,其运行时间为O(nlgn),像插入排序而不像合并排序,它是一种原地排序算法,所以说,堆排序将插入排序和合并排序的优点结合起来了。 堆排序借助于堆数据结构,(二叉)堆是一个数组,它可以被视为一棵完全二叉树,树中每个节点与数组中存放该节点值得那个元素对应。 堆排序算法可以分为以下几步: 1) 建立原先数列对应的最大(或最小原创 2012-05-12 10:49:01 · 355 阅读 · 0 评论 -
有意思的排序算法-合并排序
合并排序也可以用打牌的过程来说明,假设桌面上朝上放着两摞已经排好序的牌,现在要将这两摞已排好序的牌合成一摞,首先,取两摞中位于最上面的两张中最小的一张并将其加入到新的一摞中,然后接着从两摞中再取一张最小的加入到新的一摞中,因为第二张,肯定比第一张要大,因此要加入到第一张的后面才行。 从上面可以看出,合并排序是利用分治法进行排序的算法,直观地操作如下: 分解:将n个元素分成各含n/2个元原创 2012-05-12 10:46:51 · 380 阅读 · 0 评论 -
白话红黑树系列之一——初识红黑树
原文地址:http://blog.csdn.net/arge129/article/details/7572687红黑树是一种二叉查找树,它能保证在最坏的情况下,基本的动态操作的时间为O(lgn)。1. 红黑树的性质红黑树是一种二叉查找树,与普通二叉查找树不同之处在于以下几个方面:a) 红黑树在每一个结点上增加一个域来存储该结点的颜色,颜色可以是红(RED)的或者是黑(BLACK)原创 2012-05-16 16:50:20 · 3170 阅读 · 0 评论