
算法和数据结构
逐兔郎
想做大牛
展开
-
排序(五)——关于桶式排序
假设现在有一组小于M的正整数 a1、 a2 ,…… ,an ,对它们排序可以采用以下的思路:使用一个大小为M的数组buckets,这个数组的每一个单元称为一个个的bucket,桶,初始化全部为0。扫描数组a,当扫描到ai的时候,buckets[ai] 加1。这样当a扫描完之后,扫描buckets,打印非零单元的下标,它的值是几就打印几次。打印出来的值实际上就是排好序之后的数组a了。我们可以依次把它原创 2012-07-18 20:12:26 · 6729 阅读 · 3 评论 -
查找(二)—— 二叉查找树
参考:数据结构与算法分析——Java语言描述 (美)Mark Allen Weis 我们都知道,二叉树中每个节点都不能有多于两个的儿子。要使二叉树成为二叉查找树,要满足这样的性质:对于树中的每个节点x,它的左子树中的所有项的值小于x中的项,而它的右子树中的所有项的值大于x中的项。 上面的这个性质的说明,没有明显地指出值相等的元素的情况。当然可以把重复的元插入原创 2012-08-26 14:56:18 · 1051 阅读 · 0 评论 -
查找(一)—— 二分法查找
二分法查找比较简单,它要求要数据集是有序的。无非就是每次把要查找的数据 target 跟数据集中间的数值 data[center] 比较,如果 target ,那么就从数据集的左半边继续查找,反之从右半边查找,这个过程不断迭代,直到 target==data[center] ,或者找不到这个数。 代码:package com.BinarySearch;imp原创 2012-08-26 09:46:51 · 999 阅读 · 0 评论 -
关于单链表的一些实现
参考:数据结构与算法分析——Java语言描述 (美)Mark Allen Weis 基本上参考书上的代码,算是一个比较完全的单链表(带头结点)的实现吧。用了三个类来实现,一个类是链表本身LinkList,其中节点类ListNode作为它的内部类,是第二个类。第三个类代表位置LinkListItr。 LinkList:/** * 链表类 */p原创 2012-09-03 19:59:06 · 834 阅读 · 0 评论 -
排序(三)——关于堆排序
参考:数据结构与算法分析——Java语言描述 (美)Mark Allen Weis 堆排序的时间复杂度是O(N log N) 。堆排序是不稳定的。 首先介绍一下堆吧。堆是一颗被完全填满的二叉树,可能的例外是在底层,底层上的元素从左到右填入,这样的树被称为完全二叉树。下图所示就是一个例子: 一颗高为h的完全二叉树有2h 到 2h+1-1原创 2012-07-14 16:55:10 · 1087 阅读 · 0 评论 -
排序(二)——关于希尔排序
参考:维基百科 以及 数据结构与算法分析——Java语言描述 (美)Mark Allen Weis等 希尔排序的时间复杂度根据步长序列的不同而不同,最差空间复杂度O(n),是不稳定的排序算法。 希尔排序的名称源于它的发明者Donald Shell。该算法是冲破二次时间屏障的第一批算法之一。它通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减原创 2012-07-17 09:17:47 · 937 阅读 · 0 评论 -
图(三)—— 赋权有向图的几个算法
参考:数据结构与算法分析——Java语言描述 (美)Mark Allen Weis 包括: 1、Djkstra算法求最短路径 2、深度优先遍历 3、广度优先遍历 4、拓扑排序算法 一、Djkstra算法 顶点类有三个属性值得注意:①boolean visited,表示该顶原创 2012-08-20 19:11:44 · 7883 阅读 · 5 评论 -
图(一)——实现用邻接表表示图
现在在看图。说是邻接表是用来表示图的标准方法,我照着自己的理解写了一个用来表示一个有向图,只是用来表示图而已,没有做任何其它的工作。也不知道规范不规范。/** * 图的顶点 */package com.mygraph;public class Vertex { private Object num; //顶点的名称 public Link link; //原创 2012-08-18 16:56:47 · 2737 阅读 · 0 评论 -
图(二)—— 一个有向无权图的最短路径算法
问题的描述是这样的:有一个有向无权图G,指定一个特定的顶点s作为起点,要求找出从s出发到G中的每一个其它顶点的最短路径。如下面的这个图: (用v1、v2、……作为每个顶点的名称吧。。。) 对于顶点类Vertex要存有两个信息,dist用来保存从s到此顶点的距离,path用来保存最短路径中的前一个顶点。比如说若此顶点是v7,开始顶点是v1,最短路径是v1-v3原创 2012-08-20 15:48:11 · 7691 阅读 · 5 评论 -
用不相交集数据结构生成迷宫
之前提到的不相交集数据结构(:http://blog.youkuaiyun.com/zhutulang/article/details/7791804。)的一个应用的例子是迷宫的生成。如下图所示就是一个50*50的迷宫。 它的开始点位于图上的左上角,而终止点在图上的右下角。可以把这个迷宫看成是由50*50个单元组成的矩形,左上角的单元被连通到右下角的单元,而且这些单元与邻近的单元通过墙壁原创 2012-07-27 15:41:58 · 3576 阅读 · 2 评论 -
关于不相交集
参考: 数据结构与算法分析——Java语言描述 (美)Mark Allen Weis 等 不相交集,这种数据结构以前我倒是听都没听过。它是解决等价问题的一种有效数据结构。这种数据结构实现起来很简单,每个例程只需要几行代码,而且可以使用一个简单的数组。它的实现也非常快,每种操作只需要常数平均时间。 给定一个等价关系“~”,一个自然的问题是对于任意的a 和 b原创 2012-07-27 12:33:27 · 3855 阅读 · 0 评论 -
字典序法实现全排列
参考:http://yangyou230.iteye.com/blog/1307884 http://ashaochangfu.blog.163.com/blog/static/10425173020115217189184/ 全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。 现在说如果有一个字符串,那么原创 2012-07-19 16:55:16 · 13298 阅读 · 1 评论 -
排序(一)——几种简单的排序算法
一、冒泡排序 它的时间复杂度为O(n2) ,空间复杂度是O(1),是稳定的排序算法。稳定是指原序列中相同元素的相对顺序仍然保持到排序后的序列。 其基本思想是:经过n-1趟子排序完成,第i趟子排序从第1个数至第n-i个数,依次比较相邻的两个数,将小的数放在前面,大的数放在后面。 由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称原创 2012-07-15 19:25:02 · 1218 阅读 · 2 评论