算法与数据结构
文章平均质量分 72
yongli1992
守得云开终见日,更觉前路水复山。
展开
-
简单排序算法实现——冒泡排序
冒泡排序是最基本的排序算法之一。算法利用一个二重循环对数列进行扫描。外循环从0到a.length-1内循环从0到a.length-i-1,因为外循环每一趟结束之后,末端就会有一个大的元素到位,因此每一趟内循环搜索的范围在减少。开始时整个数组为无序序列,有序序列不存在。在内循环内逐次比较相邻两个元素。如果存在逆序就实行交换。整个算法中,元素数组的前端部分为无序数列,范围不断向原创 2013-01-27 16:27:55 · 419 阅读 · 0 评论 -
以AVL树为例理解二叉树的旋转(Rotate)操作
树旋转是在二叉树中的一种子树调整操作, 每一次旋转并不影响对该二叉树进行中序遍历的结果. 树旋转通常应用于需要调整树的局部平衡性的场合. 树旋转包括两个不同的方式, 分别是左旋转和右旋转. 两种旋转呈镜像, 而且互为逆操作. 平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树,它通过旋转不平衡的节点来使二叉树重新保持平衡,并且查找、插入和删除操作原创 2013-02-19 15:43:42 · 11802 阅读 · 6 评论 -
简单数据结构实现——二叉查找树
二叉查找树(Binary Search Tree)具有以下基本性质:1.若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;2.若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值;3.它的左右子树也分别为二叉排序树。通常采取二叉链表作为二叉排序树的存储结构。在java中构造了如下的记node类来代表单个节点:public class BinaryNo原创 2013-02-14 15:49:42 · 308 阅读 · 0 评论 -
简单数据结构实现——双链表
链表 (Linked List),基本数据结构之一,是一种逻辑上的线性表,但是物理存储上是非线性的。在存储空间上分散排布,通过构造节点,以及节点中的前驱后驱指针来串联起所有的节点,顾名曰链表。这是一种随用随建的结构,删除起来也非常方便。链表的强项在于插入删除操作,但是链表的遍历是弱项,不能做到随机遍历,只能从头到尾顺序遍历。链表的还有一个好处是大小没有任何限制,java中自带的集合 ArrayLi原创 2013-02-07 15:55:40 · 578 阅读 · 0 评论 -
简单数据结构实现——队列
队列 (queue) ,基本数据结构之一,属于FIFO(先进先出)数据结构。队列只允许在前端 (HEAD) 进行入队(插入)操作,只允许在后端 (TAIL) 进行出队(删除)操作。单队列可以使用链表来实现,实现非常简单,队列的长度也没有限制,但是插入和读取的时间代价较高。循环队列可以使用数组来实现,因此操作起来很快,但是长度一般固定。但是可以通过设计一个扩大容量的方法来使其长度可变原创 2013-02-07 15:31:55 · 754 阅读 · 0 评论 -
简单数据结构实现——堆栈
堆栈 (Stack),最基本的数据结构之一,先进后出的FILO典型结构,主要操作有push(),pop(),top()方法,分别为压栈,出栈,返回栈顶元素。在下面给出的代码实现中,增加了一些辅助的操作,包括size(), trim(), enlarge(), isEmpty(), toString()方法。并且因为还没有系统的学习泛型,因此在这里给出的是基于int型的简单实现。运用泛型的通原创 2013-02-05 22:27:00 · 389 阅读 · 0 评论 -
简单排序算法实现——堆排序
堆排序 (Heap Sort) 是利用了数据结构:完全二叉树来进行排序的算法。其基本原理先要将完全二叉树以数组的形式实现出来。再者,用于堆排序的完全二叉树必须满足最大堆(Max Heap) 的性质,即任意一个非叶子节点上的值都应该比其左孩子和右孩子的值小,满足该性质的即称为最大堆。先阐述在数组上实现完全二叉树的原理:对于数组下标从0开始的java语言,对于给定的节点下标 i ,其父节点下标原创 2013-02-04 22:03:24 · 521 阅读 · 0 评论 -
简单排序算法实现——快速排序
快速排序 (Quick Sort) 是使用“分治”思想的又一个排序算法,通过将序列不断分为子序列,最终达到单元素情况来解决问题。其大致实现过程是从待排序序列中挑选出一个主元 (pivot element,又叫枢纽元),然后将剩下的元素分割成两个部分,一个部分是小元素部分,其中所有的元素都比主元小;另一个是大元素部分,其中所有的元素都比主元大。在这一步分为小元素部分与大元素部分的过程中,每个部分原创 2013-01-31 15:46:00 · 603 阅读 · 0 评论 -
简单排序算法实现——桶排序
桶排序 (Bucket Sort) 又称箱排序,是鸽巢排序的一种归纳结果(有关鸽巢排序的内容留待后补)。桶排序是比较特殊的排序,它不属于比较排序,即有序的建立不是基于元素的比较与交换而消除逆序得到的,比较形象的讲,其对有序的建立是基于桶数组在物理内存上本身的连续性和有序性,将其作为索引,然后建立该索引与待排序数组的映射关系,然后通过遍历索引而倾倒出待排序元素,则倾倒的过程自然遵循桶数组的物理内原创 2013-01-30 18:18:30 · 431 阅读 · 0 评论 -
简单排序算法实现——选择排序
选择排序( Selection Sort ) 是基本排序算法之一。其基本工作原理是将数组的后端部分保留为无序区,在前端逐渐建立有序区。在每一次躺的操作中,从后端无序区中挑选出最小的元素,然后与无序区的第一个元素交换,于是有序区的范围被扩大了一个元素。如果某个元素已经位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素后,它们当中至少有一个被移动到了最终位置上,因此对n个元素的原创 2013-01-30 09:16:47 · 485 阅读 · 0 评论 -
简单排序算法实现——归并排序
归并排序(Merge Sort) 是一种采用了分治(Divide and Conquer) 想法的排序算法。该算法中基本的操作是合并两个已经排序的表,并将输出放到第三个表中,该过程可以通过对输入数据一趟排序来完成。基本的合并算法是取两个输入数组A和B,一个输出数组C,与三个计数器Actr,Bctr,Cctr,它们初始置于对应数组的开始端。A[Actr]和B[Bctr]中的较小者原创 2013-01-29 21:18:53 · 850 阅读 · 0 评论 -
简单排序算法实现——希尔排序
希尔排序也称递减增量排序算法,是在插入排序的基础上得到的高速稳定的排序算法,是最早冲破二次时间屏障的排序算法之一。希尔排序使用一个增量数列:h1, h2, …… ht, 要求h1=1。(该要求的存在使得希尔排序在最后一次h1=1的时候实质上进行了普通插入排序)。在每一趟中,使用当前的增量hk,对假象的每隔hk个元素的一个序列进行一次插入排序,一趟完成后对于每个i我们都有a[i]即所有相隔h原创 2013-01-28 14:55:29 · 530 阅读 · 0 评论 -
简单排序算法实现——插入排序
插入排序 Insertion Sort 为基本排序算法之一。其工作原理是将数组的后端保留为无序序列区,在前端从前往后逐渐建立有序序列区。每一次挑出后半部分无序区的第一个元素作为当前操作元素,然后从该位置向前逐个扫描,找到正确的位置进行插入,是为插入排序。在从当前位置向前扫描的过程中,如果还没有抵达正确位置,则需要有一个元素向后挪位的操作,即代码中的a[j]=a[j-1], 这是插入排序原创 2013-01-28 13:47:42 · 2733 阅读 · 0 评论 -
LeetCode:判断单链列表是否存在环
判断单链列表是否存在环,即某个节点的next指向链表中在它前面的节点,这样在链表尾部形成一环。1.判断是否存在环用一个fast指针,一个slow指针,slow每次移动1,fast每次移动2.若链表存在环,移动快的fast指针一定在环内追赶上移动慢的slow指针,则相遇2.找到环的入口当两指针第一次相遇后,证明存在环。现在将fast指针重新设为head,slow指原创 2015-01-17 15:58:48 · 1107 阅读 · 0 评论