java数据结构
liuwei0604
这个作者很懒,什么都没留下…
展开
-
java实现双向链表的操作
单向链表只能单方向的查找链表中的节点,并且在插入或者删除某一个节点的时候,必须知道其的前一个节点。当单向链表的前一个节点指向这个链表的第一个节点的时候称为循环链表。双向链表的每个结构分为三个部分,一个左指针 llink , 一个数据data ,一个右指针 rlink,其手llink存放当前节点的前一个节点,rlink指向当前节点的后一个节点。因此构造java节点类型如下public cla原创 2013-04-25 07:15:23 · 1068 阅读 · 0 评论 -
Java 实现堆排序
堆排序主要是利用堆在根节点上的特性,既在大顶堆的情况下,堆的第一个元素是堆当中最大的元素,而在小顶堆的情况下,堆的第一个元素是最小的节点。所以在堆排序的过程,主要的操作就是对每次取出堆顶的元素之后(在这里使用大顶堆),我们就选出了堆中的最大元素,然后对堆剩下的元素进行再次进行大顶堆的调正,得到一个新的大顶堆,这样再次取值的时候就可以取出剩下元素的最大值,依次类推,即可得到一个有序的数组。堆的时间复杂原创 2015-12-20 14:22:57 · 463 阅读 · 0 评论 -
快速排序
快速排序在实际中运用的比较多的算法之一。快速排序和合并排序一样都是用到了分而治之的思想。 快速首先要从数组中找到一个元素(pivot),然后把数组中比这个数大的数字全部放在这个数字的左边,比他大的数字放在他的右边,然后按照这个步骤去整理pivot的左半边和右半边,到最后数组就是一个有序的状态。快速排序的时间负责度是 n * logn ,并且是一种不稳定的排序算法。 例如 {5,5,4,3,3},原创 2015-11-29 13:05:56 · 1403 阅读 · 0 评论 -
最长回文字符串算法-Manacher’s Algorithm-马拉车算法
本文翻译于LeetCode上关于最长回文字符串的说明除了翻译之外,其中还加入了个人的理解的部分,将其中没有详细说明的部分进行了解释。时间复杂度为O(n)的算法首先,我们需要讲输入的字符串 S 进行一下转换得到 T,转换的方法就是通过在每两个字符之间插入一个字符串“#”,你马上就能知道为什么要这么做。例如 输入字符串 S = “abaaba”, 转换之后得到了 T = “#a#b#a翻译 2015-12-29 20:56:25 · 4512 阅读 · 2 评论 -
直接插入排序
上一篇写了技术基数排序,这节是关于插入排序!插入排序的思想十分简单,打扑克牌的时候我们给牌放位置的方法就是直接插入排序。首先我们拿到第一张牌的时候 例如 8,这个时候它是第一张,所以不需要比较,可以确定暂时的位置是0 (数组的下标从0开始,在这里就用0了)。然后拿到了一张 5,这个时候把5与前面的牌像比较,5 < 8,所以5应该插到8的前面去,8应该往后移动一位。此时在【0】的位置上是5,在【1】的原创 2015-11-01 15:32:28 · 372 阅读 · 0 评论 -
归并排序
归并算法的是分治思想的一种体现。归并算法的主要过程分为两步,首先是对需要排序的元素进行分组,首先一分为二(组),然后二分为四(组),在之后四分为八(组),将元素不断的划分,知道每组元素只包括两个,(当然如果需要排序的元素为奇数个,那么必定是有一组元素只包含的一个的)。在我们划分之后,在每组元素之内排序,每个小组的元素有序之后,开始合并,直到最后八合为四,四合为二,二合为一。归并排序的算法是稳定的。时原创 2015-11-15 22:38:31 · 1292 阅读 · 0 评论 -
Java实现基数排序
文章采用Java实现了基数排序基数排序的基本思想:首先对数组的所有数字按照数字的最后一位进行排序,(在十进制下,因为每个数字都是0-9,所以我们可以申请一个长度为10的桶),根据每个数字末尾数的数字放入相应的桶中,例如 125的末尾数是5,我们放入bucket[5] 中,1的末尾是1 ,我们放入buckets[1] 中,这样排序放完之后,所有的数字都按照其末尾数字的大小排序好了。第一遍排序玩之后,开原创 2015-10-24 10:41:11 · 583 阅读 · 0 评论 -
二叉树的先序遍历
二叉树的先序遍历就是先遍历根节点,然后在遍历左节点,最后遍历右节点。二叉树的遍历一般有两种实现:递归实现和非递归实现。其实递归实现和非递归实现的本质是一样的,两者都是利用了堆栈先进后出的原理来进行的。只是在递归的实现中,我们利用了系统方法调用时形成的堆栈,而非递归实现中,我们要自己来手动的实现堆栈元素的进出栈。首先是递归实现 public static void preTraversal(Tr原创 2015-11-01 17:19:08 · 1814 阅读 · 0 评论 -
冒泡排序和选择排序
两种很简单的排序方法,冒泡排序和选择排序。下面按照从小到大排序来做说明:冒泡排序:每次将未排序的数组从前往后两个相邻的元素作比较,如果前面的元素比后一个元素小,那么将这两个元素交换,那么实质上这种交换是将大的元素往后移动了一位,这样一遍排序之后,最大的元素就被放到数组的最后。然后对前面的n -1 个元素重复这个过程。选择排序:选择排序实际上对冒泡排序做了一定的改进,它也是每次把两个元素作比较,但是这原创 2015-11-07 14:35:20 · 471 阅读 · 0 评论 -
单向链表,单向循环链表的基本操作
链表可以解决数组对存储空间要求的问题,可以充分的利用存储空间,可以根据实际使用的需要来使用内存,链表的插入节点和删除节点都数组要简单,因为只要用指针加以处理就行了 ,但是在数组的查找上,数组的速度比链表快,因为从数组的索引就可以找到想要的数据,而链表需要花费很多时间去比较每一个节点,才能找到自己想要数据。 单向链表的每一个节点的数据结构都可以分为两个域,一个数据域,一个是指针域,因此可以以此来构建原创 2013-04-21 10:59:11 · 980 阅读 · 0 评论 -
使用双向链表实现队列和栈
下面是使用双向链表实现了队列的进出和栈的push和pop操作首先是依然是给出双向链表节点NodeTypepublic class NodeType { public NodeType llink; public int data; public NodeType rlink; public NodeType(int data){ this.data = data; }原创 2013-04-26 07:59:49 · 1768 阅读 · 0 评论 -
希尔排序
希尔排序是对插入排序的一种改进。 下面对希尔排序的介绍来自于维基百科*希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位下面是代码实现package com.原创 2015-12-06 15:58:50 · 1328 阅读 · 0 评论