- 博客(28)
- 资源 (7)
- 收藏
- 关注
原创 输入整数数组,调整顺序,使得奇数位于前半部分,偶数位于后半部分
/** * 题目描述: * 输入一个整数数组,程序对数组进行整理,使得奇数和偶数分开。 * 奇数位于数组前半部分,偶数位于数组前半部分都可以。 * * 分析: * 此题可以用快速排序的方法,维护两个游标 i 和 j; * i 从前向后,碰到偶数跳过去,碰到奇数停止; * j 从后向前,碰到奇数跳过去,碰到偶数停止; * 两者停止后,若i < j , 则交换i,j所指元素,i+
2013-10-20 11:16:11 2454
转载 二叉树题目
1. 二叉树的三种遍历方式先序遍历:节点 -> left子节点(包括其子树)-> right子节点(包括其子树);后序遍历:left子节点(包括其子树)-> right子节点(包括其子树)-> 节点;中序遍历:left子节点(包括其子树)-> 节点 -> right子节点。2. 怎样从根开始逐层打印二叉树结点数据其实就是广度优先遍历(BFS)的思想。使用一个队列
2013-10-17 19:51:54 1085
转载 栈和队列题目
1. 设计含min函数的栈,要求min,push和pop时间复杂度都是O(1)。设计一个辅助栈,存储当前栈中元素的最小值。Push操作时,第一个元素不用比较,自动成为最小值入栈,其它元素每次都和栈顶元素比较,小的那个放到栈顶。注意:这里如果当前辅助栈顶元素小于新元素,则把辅助栈顶元素再入栈一次。Pop的时候,同时从原栈和辅助栈pop。所以,原栈和辅助栈大小相等。2. 用两个栈实现队列
2013-10-17 16:00:26 1562
转载 单链表题目
1. 单链表反转一个指针(引用)curr指向原链表头;头指针head指向当前头(开始时指向原链表头),循环开始:next指向curr下一个节点,即next = curr.next;nextNext指向next下一个节点,即nextNext = next.next;(前两步根据curr更新next和nextNext的位置)next.next = head; head = next
2013-10-17 12:39:42 1241
转载 二叉堆
二叉堆是一棵完全二叉树,这个性质保证二叉堆可以用一个简单数组(Array)表示。根元素放在 Array[ 1 ] 处(Array[ 0] 不使用)。对数组中任一位置i上的元素,其左二子在位置2i上,右儿子在左儿子后的单元 2i+1 上,它的父亲则在位置 ⌊ i/2 ⌋ 上。堆序性质堆中任意节点小于它的所有后裔(最小元素在跟上)。insert在下一个可用位置创建一个空
2013-10-17 11:56:45 934
原创 优先队列(堆)目录
优先队列是至少存在以下两种操作的数据结构:insert:插入;deleteMin:找出,返回并删除优先队列中最小的元素。优先队列的实现:二叉堆
2013-10-17 11:32:24 774
原创 桶排序
输入数据A1,A2,...,AN 必须只有小于M的正整数组成。使用一个大小为M的称为count的数组,它被初始化为全0;count有M个单元(桶),初始为空;当读 Ai 时,count [Ai] 增 1;所有输入数据读入后,扫描数组count,打印出排序后的表。算法复杂度为 O(M+N)。
2013-10-17 10:39:55 757
转载 递归问题(Recursive)
定义当一个函数用它自己来定义时就称为是递归的。基本原则1. 基本情形。必须总要有某些基准的情形,它们不用递归就能求解。2. 不断推进。对于那些要递归求解的情形,递归调用必须总能够朝着一个基准情形推进。例子
2013-10-16 21:35:18 1188
转载 图算法 最小生成树 Prim算法 Kruskal算法
最小生成树一个无向图G的最小生成树就是由该图的那些连接G的所有顶点的边构成的树,且总价值最低。Prim算法Prim算法把每一个节点一个一个加在最小生成树上,是贪心算法。算法的每一阶段都可以通过选择边(u,v)使得(u,v)的值是所有u在树上但v不在树上的边的值中最小者而找到一个新的顶点并把它添加到这棵树中。下面示意从v1开始构建最小生成树Kruskal算法
2013-10-07 22:52:49 1601
转载 图算法 网络流问题
一个有向图G = (V,E),边容量为c(v,w)。一个发点s,一个收点t。最大流问题是确定s到t可以通过的最大流量。左边为原图G,中间位流图Gf,表示算法任意阶段已经达到的流(初始为0),右边为残余图Gr,表示对于每条边还能再添加上多少流。在每个阶段,寻找Gr中从s到t的一条路径(增长通路)约定,一旦注满一条边,则这条边就要从残余图中除去。当发现Gr中没有通路时算法终止。
2013-10-07 22:22:49 1906
转载 图算法 无圈图和关键路径分析
无圈图如果已知图是无圈的,则可以利用拓扑顺序选择顶点来改进Dijkstra算法。由于选择和更新可以在拓扑排序执行的时候进行,因此算法能够一趟完成。因为当一个顶点v被选取之后,按照拓扑排序法则它没有从unknown顶点发出的进入边,因此它的距离dv可不再被更新。这样的话,就不需要优先队列了。运行时间为O(|E| + |V|)。关键路径分析如图,每个节点表示一个必须执行的动作以
2013-10-07 21:56:22 3557
转载 图算法 具有负边值有向图的单源最短路径
Dijkstra对具有负边值得图是无效的。对于负边值得图:1. 开始时,把s放进队列2. 在每一阶段让一个顶点v出队,找出所有与v邻接的顶点w,使得dw > dv + c(v,w)。更新这些点的dw和pw,并在w不在队列中的时候把它入队。(可以为每个顶点设置一个比特位以指示它是否在队列中)。3. 重复以上过程直到队列为空。void weightedNegative(Vert
2013-10-07 21:24:12 3107 1
转载 图算法 Dijkstra算法 赋权图的单源最短路径
Dijkstra是解决有向赋权图单源最短路径问题的算法,是贪心算法的典型代表。1. 在每个阶段,Dijkstra算法选择一个顶点v,它在所有unknown顶点中具有最小的dv,同时算法声明从s到v的最短路径是known的。2. 更新dw值,若dv + c(v,w)是一个改进的值时,我们就置dw = dv + c(v,w)。顶点Vertex的定义如下:class Vertex{
2013-10-07 21:07:36 2985
转载 图算法 单源最短路径问题 无权最短路径
单源最短路径问题给定一个赋权图 G = (V, E)和一个特定顶点s作为输入,找到s到G中每一个其他顶点的最短赋权路径。无权最短路径
2013-10-07 17:51:23 4222
转载 图算法 图的表示(邻接表和邻接矩阵)和拓扑排序
图的表示图有两种表示方法,分别是邻接矩阵和邻接表。这里以有向图为例说明。邻接矩阵邻接矩阵是一个二维数组A。对于每条边 (u,v),置A[u][v]等于true;否则,数组元素为false。如果边有一个权,那么可以置A[u][v]等于该权,而使用一个很大或者很小的权作为标记表示不存在的边。它的空间需求为Θ(|V|^2)。邻接表大多数情况,图都是比较稀疏的,
2013-10-07 14:26:23 6999
原创 归并排序(MergeSort)Java实现
归并排序以O(NlogN)最坏情形时间运行。基本操作是合并两个已排序的表。因为两个表已经排序,将输出放在第3个表中,可以通过对输入数据一趟排序来完成。基本的合并算法是1. 取两个输入数组A和B,一个输出数组C,以及3个计数器Ac, Bc, Cc,他们初始置于对应数组的开始端;2. A[Ac] 和 B[Bc]中的较小者被拷贝到C中的下一个位置,相关的计数器向前推进一步;3. 当两
2013-10-07 11:55:37 3508
原创 堆排序 Java实现
/** * 堆排序 * * 利用优先队列,以 O(NlogN)时间排序 * 1.利用数组元素建立二叉堆,花费O(N)时间 * 2.执行N次deleteMax操作,得到N个元素的排序。每个deleteMax花费O(logN),总花费O(NlogN). * * 具体过程: * 1.以线性时间建立一个最大二叉堆 ; * 2.每次将堆中第一个元素(树根)与最后一个元素交换,堆的大小
2013-10-07 11:26:49 868
原创 希尔(Shell)排序 Java实现
在插入排序中,已经知道,通过交换相邻元素进行排序的任何算法平均都需要Ω(N^2)时间。基于这种认识,希尔排序通过比较相距一定间隔的元素来工作。各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。因此,希尔排序也叫缩减增量排序。希尔排序使用一个序列h1, h2, ..., ht, 叫做增量序列。只要h1 =1, 任何增量序列都是可以的,但在增量上是有文章可做的,一些
2013-10-07 10:18:43 1018
转载 红黑树 自底向上和自顶向下插入, 自顶向下删除
本文主要参考 Mark Allen Weiss 的 Data Structures and Algorithn Analysis in Java (Second Edition) 的中译本,对其中省略的地方进行了补充。什么是红黑树?红黑树本质上是二叉查找树,但增加了一些性质,使这种二叉查找树更加平衡,使得对其操作最坏情况花费O(logN):1) 每一个节点或者为红,或者为黑;2)
2013-10-06 12:01:51 4388
转载 Java知识点复习2 与运行环境交互
1. Java命令行参数 //可以以空格为分割传入命令行参数。 //若参数本身含有空格,则用双引号括起来 public static void main(String[] args) { System.out.println(args.length); for(String arg : args){ System.out.println(args); } }
2013-10-05 19:13:53 763
转载 Java知识点复习1基础备忘
1. Java命名习惯1)包名字母一律小写;2)类名,接口名应该使用名词,每个单词首字母大写;3)方法名,第一个单词小写,后面每个单词首字母大写;4)变量名,第一个单词小写,后面每个单词首字母大写;5)常量名中的每个字母一律大写。2. 垃圾回收(gc)1)后台线程;2)管理堆内存;3)两件基本任务:发现无用对象;回收无用对象所占空间。
2013-10-05 18:34:37 700
原创 最长公共子序列(LCS)和最长公共子串(LCSubString)
最长公共子序列public class LCS{ public static String lcs(String a, String b) { int[][] lengths = new int[a.length()+1][b.length()+1]; // row 0 and column 0 are initialized to 0 al
2013-10-05 15:54:45 1582
Java核心技术第8版 卷I 基础知识part2 中文版 有目录可标记
2013-01-08
Java核心技术第8版 卷I 基础知识part1 中文版 有目录可标记
2013-01-08
Java核心技术第8版 卷II 高级特性part3 中文版 有目录可标记
2013-01-08
Java核心技术第8版 卷II 高级特性part2 中文版 有目录可标记
2013-01-08
Java核心技术第8版 卷II 高级特性part1 中文版 有目录可标记
2013-01-08
C++程序间消息模式通信(VS2010工程文件)
2012-11-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人