![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构算法
inferno devil
这个作者很懒,什么都没留下…
展开
-
堆排序
算法描述是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 在堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。堆中定义以下几种操作: 最大堆调整:将堆的末端子节点作调整,使得子节点永远小于父节点 创建最大堆:将堆中的所有数据重新排序 堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算图解参考代码public class H原创 2020-07-08 19:34:43 · 127 阅读 · 0 评论 -
归并排序
算法描述是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并操作的工作原理如下:第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复步骤3直到某一指针超原创 2020-07-07 22:05:36 · 82 阅读 · 0 评论 -
希尔排序
算法描述希尔排序是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。图解参考代码public class ShellSort { public static void main(String[] args) { int[] arr = {49, 38, 65, 97原创 2020-07-07 19:04:36 · 91 阅读 · 0 评论 -
插入排序
算法描述插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。图解参考代码public class InsertSort { public static void main(String[] a原创 2020-07-07 16:27:19 · 92 阅读 · 0 评论 -
冒泡排序
算法描述它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。图解参考代原创 2020-07-07 12:00:04 · 118 阅读 · 0 评论 -
选择排序
一,思路选择排序法是一种不稳定的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。二,图片解释三,参考代码public class SelectSort { public static void main(String[] args) { int [] arr = {49,38,65,97,76,1原创 2020-07-07 10:30:45 · 292 阅读 · 0 评论 -
算法相关概念
算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。算法的空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。算法的稳定性通俗地讲就是能保证排序前两个相等的数据其在序列中的先后位置顺序与排序后它们两原创 2020-07-07 10:29:31 · 162 阅读 · 0 评论 -
数据结构---哈希表
1.01 哈希表-散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。-给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函...原创 2019-06-02 08:50:11 · 468 阅读 · 0 评论 -
数据结构---图
1.01 图图(Graph)是由顶点和连接顶点的边构成的离散结构。在计算机科学中,图是最灵活的数据结构之一,很多问题都可以使用图模型进行建模求解。例如:生态环境中不同物种的相互竞争、人与人之间的社交与关系网络、化学上用图区分结构不同但分子式相同的同分异构体、分析计算机网络的拓扑结构确定两台计算机是否可以通信、找到两个城市之间的最短路径等等。图的两个重要组成部分结点Vertex边Ed...原创 2019-05-25 22:51:38 · 81 阅读 · 0 评论 -
数据结构---红黑树(RBTree)
1.01 红黑树-红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。-红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。-红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。-它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效...原创 2019-05-24 17:11:55 · 205 阅读 · 0 评论 -
数据结构---自平衡二叉树AVL
1.01 AVL树名字缘由:G.M.Adelson-Velsky和E.M.Landis 。是一种最早的自平衡二分搜索树结构 。AVL树既是平衡二叉树。AVL树的定义首先要求该树是二叉查找树(满足排序规则),并在此基础上增加了每个节点的平衡因子的定义,一个节点的平衡因子是该节点的左子树树高减去右子树树高的值。平衡因子BF:该节点的左子树的深度减去它的右子树深度。(平衡二叉树上的所有节...原创 2019-05-23 17:48:43 · 287 阅读 · 0 评论 -
数据结构---并查集
1.01 并查集:并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。转的一个超级有意思,好懂的并查集解释, 膜拜大神~~并查集:由孩子指向父亲的树结构,主要解决连接问题网络中结点的连接状态网络是一个抽象的概念:用户之间形成的社交网络商品,图书,音乐,火车…很多很多数学中的集合类实现 并集 查询连...原创 2019-05-14 11:38:04 · 130 阅读 · 0 评论 -
数据结构---线段树
1.01 线段树-线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。-使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。一般不考虑增加和删除,只考虑更新和查询,每个结点存储的是一段信息。线段...原创 2019-05-13 21:50:26 · 203 阅读 · 0 评论 -
数据结构---列表
1.列表在基础数据结构中,列表作为最为基础的一个数据结构进行体现。2.列表的模型3.基本算法1.增加元素(在头部/尾部/其余地方) 2.删除元素(在头部/尾部/其余地方)3.扩容/缩容4.获取有效长度5.判断列表是否为空6.获取某位置元素(头部/尾部/其余地方)7.改变某位置的元素8.寻找元素,返回下标。9.列表是否包含某元素10.获取容积11.清除列表12.交换...原创 2019-03-26 11:02:05 · 4652 阅读 · 0 评论 -
数据结构---队列
1.队列 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。2.队列的模型3.基本算法1.获取有效长度2.是否为空3.进队4.出队5.获得对头6.清除队7.重写toString方法4.实现方法一,顺序队列...原创 2019-03-26 11:46:19 · 229 阅读 · 0 评论 -
八皇后问题(Java)
八皇后问题:皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 ≥ 1 或 n1 ≥ 4 时问题有解。解法思路:尝试维护一个8*8的二...原创 2019-04-04 18:10:18 · 669 阅读 · 0 评论 -
汉诺塔问题(Java)
汉诺塔问题:相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。解题思路: ...原创 2019-04-10 20:38:01 · 5108 阅读 · 3 评论 -
数据结构---树
树结构树结构本身是一种天然的组织结构,将数据使用树结构存储后,会大幅高效率。原创 2019-04-12 16:50:33 · 241 阅读 · 0 评论 -
递归
递归-递归就是方法里调用自身-在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口-递归算法解题通常显得很简洁,但递归算法解题的运行效率较低-在递归调用的过程中,系统为每一层的返回点、局部变量等开辟了栈来存储。递归次数过多容易造成栈溢出等-具体地说,如果递归函数调用自己,则被调用的函数也将调用自己,这将无限循环下去,除非代码里有终止调用的语句。通常的方法是将递归调用放在if语句...原创 2019-04-16 17:41:30 · 169 阅读 · 0 评论 -
数据结构---集合与映射
1.01 集合存储不重复元素的容器有序集合中的元素具有顺序性,基于搜索树实现;无序集合中的元素没有顺序性,基于哈希表实现。顺序性,是指按照元素的大小进行排序,并非指插入的顺序 有序性,是指元素的进场顺序和出场顺序一致应用场合客户统计 词汇量统计1.02 Set集合接口定义public interface Set<E>{ void add(E e); //向...原创 2019-04-17 20:49:46 · 267 阅读 · 0 评论 -
数据结构---堆和优先队列
1.01 堆是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆的性质堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。最大堆将根节点最大的堆叫做最大堆或大根堆。最小堆根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。堆支持的基本操作build:建立一个空堆;insert:向堆中插入一个新元素;u...原创 2019-04-18 10:47:46 · 153 阅读 · 0 评论 -
数据结构---Trie
1.01 Trie原创 2019-04-18 18:07:51 · 167 阅读 · 0 评论 -
数据结构---栈
栈: 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈的模型:基本算法:1.栈是否为空2.获取栈顶元素...原创 2019-03-26 09:35:28 · 223 阅读 · 0 评论