
算法与数据结构
文章平均质量分 79
duheaven
这个作者很懒,什么都没留下…
展开
-
冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序算法的运作如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作转载 2013-10-27 14:56:08 · 645 阅读 · 0 评论 -
各类数据结构的特点
数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排。数据结构包括数组、链表、栈、二叉树、哈希表等等。算法对这些结构中的数据进行各种处理。例如,查找一条特殊的数据项或对数据进行排序。 掌握这些知识以后可以解决哪些问题呢? 现实世界数据存储 程序员的工具 建模 数据结构的特性: 数组:优点是插入快,如果知道下标,可以非常快地存取。缺点是查找慢,删除慢,大小固转载 2014-06-10 20:39:02 · 2610 阅读 · 0 评论 -
红黑树
红黑树是一种经典的数据结构,在linux内存管理、nginx 等很多地方用到它。主要操作包括插入、删除,其中插入6种情况,删除8种情况,详细的思路就不说了,如果不太明白的请参考算法导论13章,看的时候一定要把每一种插入、删除的情况在纸上自己画出来,这样会节省你很多时间。下面是java实现的代码: [java] view plaincopy转载 2014-06-08 08:49:45 · 598 阅读 · 0 评论 -
Treap(树堆)
Treap=Tree+Heap。Treap本身是一棵二叉搜索树,它的左子树和右子树也分别是一个Treap,和一般的二叉搜索树不同的是,Treap记录一个额外的数据,就是优先级。Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质(在这里我们假设节点的优先级大于该节点的孩子的优先级)。但是这里要注意的是Treap和二叉堆有一点不同,就是二叉堆必须是完全二叉树,而Treap可以并不一定是转载 2014-06-08 09:54:55 · 669 阅读 · 0 评论 -
二叉树
为什么使用树: 树结合了两种数据结构的有点:一种是有序数组,树在查找数据项的速度和在有序数组中查找一样快;另一种是链表,树在插入数据和删除数据项的速度和链表一样。既然这样,我就要好好去学了.... (最主要讨论的是二叉树中的二叉搜索树,即一个节点的左子节点关键值小于这个节点,右子节点的关键值大于这个节点) 设计前的思考: 树——>元素(节点)转载 2014-06-04 21:21:08 · 693 阅读 · 0 评论 -
算法导论-栈和队列的简单实现
栈: 接口: public interface Stack { boolean isEmpty(); void clear(); T pop(); boolean push(T t); int length(); // 查看站顶元素,不执行移除 T peek(); // 返回对象位置 int search(T t); }原创 2014-06-02 15:36:54 · 764 阅读 · 0 评论 -
快速排序及优化
http://www.blogjava.net/killme2008/archive/2010/09/08/quicksort_optimized.html update:更正选择中数的描述,在7到39之间的数组大小选择median-of-three来选择pivot,大小等于7的数组则直接使用中数作为pivot。 quicksort可以说是应用最广泛的排序算法之一,它的基本思想是分转载 2014-04-09 22:01:31 · 594 阅读 · 0 评论 -
快速排序
快排是分治法的一个应用,快排主要是通过一个设定枢轴,然后以这个枢轴为标杆,将待排序列按大小分成比枢轴大的,和比枢轴小的两部分。然后在对划分完的子序列进行快排,知道子序列中元素的个数为1位置。 快速排序实现 快排是程序员必须掌握的,举一个例子来解释,如下图: 首先选定枢轴,一般设置low所对应的元素位置为枢轴,如图选定的枢轴为26。 在高位指针始终不小于低位指针的前提下: 高位指针开始转载 2013-10-30 20:49:50 · 678 阅读 · 0 评论 -
算法导论_最大子数组问题(分治策略)
package com.wzs; import java.util.Arrays; /** * 算法导论--page41 * * @author Administrator * */ public class FindMaximumSubArray { public static void main(String[] args) { int转载 2014-04-06 19:06:04 · 496 阅读 · 0 评论 -
插入排序
插入排序 将数组所有元素划分成了有序区和无序区,假设当前数组有 N 个元素, 开始默认第一个元素(下标为0)所处的位置是有序区,这是局部有序,从第二个元素(i=1)至数组最后一个元素(i=N-1)属于无序区; 假设数组元素是按从左至右存放的,如果用 i 来标记无序区中的第一个元素下标,也就是无序区中最左边或者说是无序区中下标值最小的下标, 则每趟排序是将下标 i 所指向的有效值插入有序区的适转载 2013-10-28 21:52:24 · 591 阅读 · 0 评论 -
堆排序
二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树。 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。下图展示一个最小堆:转载 2013-11-01 14:46:19 · 567 阅读 · 0 评论 -
希尔排序
import java.util.Arrays; import java.util.Random; public class ShellSort { /** * 希尔排序也是一种插入排序方法,实际上是一种分组插入方法 * 先取一个小于n的整数d1作为一个增量,把表的全部记录分成d1个组,所有 * 距离为d1的倍数的记录放在同一个组中,在各组内进行直接插入排序,然后 *转载 2013-11-01 09:58:15 · 676 阅读 · 0 评论 -
常用排序总结
排序法 平均时间 最差情形 稳定度 额外空间 备注 冒泡 O(n2) O(n2) 稳定 O(1) n小时较好 交换 O(n2) O(n2) 不稳定 O(1) n小时较好 选择原创 2013-10-31 20:20:47 · 560 阅读 · 0 评论 -
选择排序
1、选择排序的基本思想 每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。我们主要介绍简单选择排序、树型选择排序和堆排序。 简单选择排序的基本思想:第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。共需进行i-1趟比较,直到所有记录排序完成为止。例如:进行第i趟选择时,从转载 2013-10-31 20:09:33 · 630 阅读 · 0 评论 -
归并排序
归并排序是另一类不同的排序方法,所谓归并,就是把两个或者两个以上的有序表合并成一个新的有序表的过程。 归并排序的基本思想: 将一个含有n个序列的有序表看成是n个长度为1的有序表,然后两两归并,得到[n/2]个长度为2的有序表,然后再两两归并,直到得到一个长度为n的有序表为止。 下面是归并排序的一个简单的例子: 初始值 【49】 【38】 【65】 【97】 【76转载 2013-10-29 20:57:52 · 461 阅读 · 0 评论 -
跳跃表-原理及Java实现
跳跃表的引入 我们知道,普通单链表查询一个元素的时间复杂度为O(n),即使该单链表是有序的,我们也不能通过2分的方式缩减时间复杂度。 如上图,我们要查询元素为55的结点,必须从头结点,循环遍历到最后一个节点,不算-INF(负无穷)一共查询8次。那么用什么办法能够用更少的次数访问55呢?最直观的,当然是新开辟一条捷径去访问55。转载 2014-06-15 10:02:13 · 1341 阅读 · 0 评论