数据结构与算法
DreamGodJava
一个java初学者
展开
-
数据结构与算法概念和术语
程序设计 = 数据结构 + 算法数据结构数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。基本的概念和术语:数据:描述客观事物的符号,是计算机可以操作的对象,能被计算机识别,并输入给计算机处理的符号集合。数据元素:是组成数据的,有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录。数据项:一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。...原创 2019-05-03 21:58:42 · 194 阅读 · 0 评论 -
排序算法之快速排序(五)
快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行。例如:4,3,1,2,6,5,1.刚开始定义两个变量i和j指向数组的首尾,首先将i号下标元素值拿出来当作标记位。从j开始由后向前找到第一个比标记位4小的值放到i好下标位置即图2,然后i向后移动找到第一个比标记位4...原创 2019-08-06 09:29:50 · 270 阅读 · 0 评论 -
排序算法之希尔排序(四)
希尔排序:希尔排序是插入排序的优化算法,算法思想:通过将全部元素分为几个区域来提升插入排序的性能。先将步长设为数组的一半,将分好的区域进行插入排序,之后步长gap每次等于他的一半,即gap /= 2。当步长为1时,就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了,插入速度快。例如:数组 2,5,7,3,4,9,6,8,1,10第一次gap=5 此时的分组如下,进行插入排序...原创 2019-08-05 23:15:56 · 117 阅读 · 0 评论 -
排序算法之插入排序(三)
插入排序:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。例如;给定一个数组 3,1,4,2,5第一趟 3,1,4,2,5第二趟 1,3,4,2,5...原创 2019-08-05 11:30:02 · 125 阅读 · 0 评论 -
排序算法之选择排序(二)
选择排序:将数组分为两个区域,排好序的和未排序的区域,每一趟下来在未排序的区域中找到最小的放在最前面(也可以将最大的放在最后面),持续进行n趟之后,数组有序。例如:原数组 3,1,4,2,5第一趟 1,3,4,2,5第二趟 1,2,4,3,5第三趟 1,2,3,4,5此时排序就已经完成了。代码实现使用双重for循坏即可时间复杂度 O(n^...原创 2019-08-04 11:52:12 · 113 阅读 · 0 评论 -
排序算法之冒泡排序(一)
冒泡排序是最常使用的一种排序算法,算法思想是从头到尾遍历数组,将相邻的两个值进行比较,小的放在前面,大的放在后面。这样第一趟排序之后,最后一个位置所放的元素就是最大的值,第二趟排序之后,倒数第二个元素也排好了。经过n次排序之后,所有的值就排序完成了。比如无序数组 3,1,4,2,5第一躺 1,3,2,4,5第二趟 ...原创 2019-08-04 11:13:24 · 119 阅读 · 0 评论 -
栈的链式存储结构
栈的链式存储结构我们知道栈是特殊的线性表,那么栈的链式存储和单链表很相似,就是简化版的单链表,top是头指针,插入完成之后要将头指针指向栈顶元素。链栈的代码实现结点结构public class Node<T> { T data; Node<T> next; public Node(T value){ data = value...原创 2019-05-17 13:24:43 · 345 阅读 · 0 评论 -
栈的顺序存储结构
栈的定义(后进先出LIFO)栈(stack)是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端叫做栈顶,另一端叫做栈底。不含元素的栈叫做空栈。元素插入叫入栈,删除叫出栈。...原创 2019-05-17 13:00:43 · 219 阅读 · 0 评论 -
KMP算法
KMP算法:D.E.Knuth、J.H.Morris和V.R.Pratt三位前辈发表的一个模式匹配算法,可以避免重复遍历的情况普通的字符串匹配算法:串S叫做主串,T是要匹配的串叫做模式串,每次从头开始一位位比较,一旦发现不同,将T串向右移动一位,继续从头开始比较。第一次匹配0,1之后发现2号地址不同,然后开始新一轮的比较,将模式串右移一位,继续从头开始比较第二次匹配发现1号位置元素...原创 2019-05-22 00:53:41 · 128 阅读 · 0 评论 -
单链表与顺序表的优缺点
简单的对单链表和顺序表做个对比:1.存储分配方式顺序表用连续的内存依次存储线性表的数据元素单链表用一组任意的存储单元存放线性表的元素2. 时间性能顺序表单链表查找O(1)O(n)插入O(n)O(1)删除O(n)O(1)3. 空间性能顺序表需要预先分配内存大小,分大了浪费,小了不够,元素个数受限制。单链表不需要预先分配,用的时候...原创 2019-05-16 21:00:52 · 1796 阅读 · 0 评论 -
线性表的链式存储---单链表
单链表单链表:n个结点链接成一个链表,就是线性表的链式存储,因为此链表的每个结点只包含一个指针域,所以叫做单链表。结点由存储数据元素的数据域和存储指针的指针域组成我们把单链表的第一个结点叫做头指针,之后的每一个结点就是上一个结点的后继结点指向的位置。为了方便表示,一般在第一个结点之前设置一个结点,称为头结点,头结点的数据域可以不存储任何信息,也可以存储线性表的长度等附加信息,指针域指向第...原创 2019-05-16 20:50:13 · 214 阅读 · 0 评论 -
队列的链式存储
队列也是一种特殊的线性表,他的链式存储和单链表基本相同,只是增加和删除是固定了位置而已。队列的链式存储叫做链队列。一般将队头指针指向队头,而将队尾指针指向队尾。链队列的简单实现结点代码如下public class Node<T>{ T date; Node<T> next; public Node(){ this(null)...原创 2019-05-21 23:24:18 · 269 阅读 · 0 评论 -
循环队列
循环队列队列:只允许在一端进行插入,另一端进行删除的线性表循环队列:队列首尾相接的顺序存储结构称作循环队列。队列顺序存储的不足:顺序存储我们一般使用数组,那么假设一个队列有n个元素,首先需要建立一个大于n的数组,把所有元素存入数组的前n个地址,每次删除完之后前面也就是队头所在的位置会空出来,无法继续利用,就需要所有元素向前移动,但这样时间复杂度为O(n).除此之外,如果数组长度为n,队头...原创 2019-05-21 21:45:13 · 281 阅读 · 0 评论 -
不带头结点的双向循环链表
基本概念循环链表:将单链表中最后一个结点的next指向头结点或者空指针,就使得整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。双向链表:是在单链表的每个结点中,再设置一个指向其前驱结点的指针域prior,在双向链表的结点中有两个指针域,一个next指向直接后继,一个prior指向直接前驱。双向循环链表:将二者结合起来,结点有两个指针域,且最后一个结点的next指向...原创 2019-05-21 18:46:36 · 4763 阅读 · 0 评论 -
线性表的顺序存储
线性表的顺序存储线性表的顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。线性表的元素类型相同,用一段连续的地址存储,可以使用数组来存储实现线性表的顺序存储。线性表的存储结构代码如下。class MyArrayList{ private final static int MAXSIZE = 2; //线性表数组的初始长度,这里设置2是为了测试 int[] data...原创 2019-05-03 23:46:34 · 2026 阅读 · 0 评论 -
排序算法之归并排序(六)
归并排序:建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。例:2,5,7,3,4,9,6,8,1,101.先将数组中的元素分组,{2,5,7,3,4},{9,6,8,1,10},2.继续分...原创 2019-08-19 16:29:55 · 241 阅读 · 0 评论