![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java 数据结构与算法
文章平均质量分 92
Java数据结构与算法
Purine King
这个作者很懒,什么都没留下…
展开
-
排序算法 - 插入排序(Insertion Sort)
插入排序插入式排序属于内部排序法, 是对于欲排序的元素以插入的方式找寻该元素的适当位置, 以达到排序的目的。* 插入排序的问题: 当需要排序的数组中小值越靠后, 就会循环判断次数越多(希尔排序是插入排序的优化版本, 又称缩小增量排序)插入排序的演变过程(从小到大)把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素, 无序表中包含有 n-1 个元素, 排序过程中每次从无序表中取出第一个元素, 把它的排序码依次与有序表元素的排序码进行比较, 将它插入到有序表中的适当位置原创 2020-12-23 15:49:27 · 183 阅读 · 0 评论 -
排序算法 - 选择排序(Selection Sort)
选择排序(Selection Sort)选择式排序也属于内部排序法, 是从欲排序的数据中, 按指定的规则选出某一元素, 再依规定交换位置后达到排序的目的。选择排序的演变过程(从小到大)第一次从 arr[0]~arr[n-1]中选取最小值,与 arr[0] 交换第二次从 arr[1]~arr[n-1]中选取最小值, 与 arr[1] 交换第三次从 arr[2]~arr[n-1]中选取最小值, 与 arr[2] 交换第 i 次从 arr[i-1]~arr[n-1]中选取最小值, 与 arr[i-1原创 2020-12-21 16:44:42 · 216 阅读 · 0 评论 -
排序算法 - 冒泡排序(Bubble Sort)
冒泡排序(Bubble Sort)排序过程: 从数组下标 0开始比较相邻元素, 当发现逆序时交换,很像水低开始往上冒泡冒泡排序的演变过程(从小到大)外循环共进行数组的大小-1次内循环的循环次数是跟着外循环递减如果内循环中, 没有发生一次交换, 说明排序以完成,可以提前结束排序public static void main(String[] args) { int arr[] = {3, 9, -1, 10, -2}; int temp; System.out.println("排序原创 2020-12-17 17:27:27 · 209 阅读 · 0 评论 -
递归【迷宫问题和八皇后问题】
递归概念简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归需遵循的规则执行一个方法时, 就创建一个新的受保护的独立空间(栈空间)。方法的局部变量是独立的, 不会相互影响, 比如 n 变量。如果方法中使用的是引用类型变量(比如数组), 就会共享该引用类型的数据递归必须向退出递归的条件逼近, 否则就是无限递归,出现 StackOverflowError异常。当一个方法执行完毕,或者遇到return,就会返回,遵守谁原创 2020-11-12 20:27:27 · 191 阅读 · 0 评论 -
前缀 中缀 后缀表达式
前缀表达式(Polish expression, 波兰表达式)前缀表达式前缀表达式的运算符位于操作数之前。 (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6。运算过程例如:(3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 , 针对前缀表达式求值步骤如下:从右至左扫描,将6、5、4、3压入堆栈遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素),计算出3+4的值,得7,再将7入栈接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈最后原创 2020-11-05 12:50:04 · 3921 阅读 · 1 评论 -
栈 - 快速入门
概述栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。应用场景子程序的调用: 在跳往子程序前, 会先将下一个指令的地址存到栈中, 直到子程序执行完后再将地址取出, 回到原来的位置 如浏览器的后退/向前, JVM的虚拟机栈表达式的转换(如 中缀表达式转后缀表达式)与原创 2020-11-02 21:16:16 · 131 阅读 · 0 评论 -
单向环形链表&解决Josephu问题
单项环形链表思路长度为1时(1)新创建的boy节点是首节点。firts=boy。(2)自己构成环形链表。first.next = frist。(3)first是首节点,同时又是尾节点,辅助指针(变量)指向fisrt。curBoy=first。长度不为1时(1)讲boy节点添加至环形链表最后。curBoy.next = boy;//curBoy节点永远是环形链表的尾结点(2)构成环形链表。boy.next = first。// 创建一个Boy类,表示一个节点(Boy 节点就是个原创 2020-11-02 12:43:39 · 138 阅读 · 0 评论 -
双向链表
单链表的缺点查找的方向只能是一个方向。节点不能自我删除。双向链表与单链表比较每个节点包含数据域, 指向下一个节点的 next(地址/引用)和多了一个上一个节点的 pre(地址/引用)。单向链表是只能单方向查找节点, 而双向链表可以向前或向后查找节点。单向链表不能自我删除, 而双向链表, 则可以自我删除节点。双向链表的增删改查思路遍历方法和单链表一样,只是可以向前,也可以向后查找。添加(以添加到双向链表的最后为例)。(1)先找到双向链表的最后节点。(2)temp.next=新原创 2020-10-29 20:48:43 · 105 阅读 · 0 评论 -
单链表
链表链表是有序列表,线性结构。链表是以节点的方式来存储,是链式存储。每个节点包含data域,next域(指向下一个节点)。节点之间不一定是连续的地址,链表存储空间不连续(不像数组)。链表分带头节点的链表和没有带头节点的链表,根据实际的需求来确定。单链表的增删改查添加节点(创建)先创建一个hear头节点(头结点不存放数据,仅仅作为当前链表的入口;head 字段的值不能改变,一旦改变,就丢失了整个链表的入口,我们也就无法通过 head 找到链表了;头结点是为了操作的统一与方便而设立的,放在原创 2020-10-27 20:47:28 · 367 阅读 · 0 评论 -
数组环形队列
队列是一个有序列表,可以用数组或链表来实现,遵循先入先出原则。数组环形队列实现方式1,front 指向队列的第一个元素,初始值为0。2,rear 指向队列的最后一个元素的后一个位置,此元素不为存值,用于空出一个空间作为约定。3,队列满条件:(rear + 1) % maxSize == front4,队列空条件:rear == front5,队列中有效数据个数:(rear + maxSize - front) % maxSize在这里使用%是为了防止数组越界,让指针从新回到数组第一个元素。原创 2020-10-26 22:20:57 · 286 阅读 · 0 评论 -
稀疏数组
使用场景当一个数组中大部分元素为0或者同一个相同的值时, 便可以使用稀疏数组稀疏数组元素结构1. 记录指定数组一共有几行几列及有多少个不同的值(有效值)2. 将具有不同值的元素的行列及值记录在一个小规模的数组中, 从而缩小数据来达到压缩的目的(压缩后的数据可用于存取等功能)二维数组(原始数据)转换稀疏数组的思路 1. 遍历原数组, 获取有效值个数 sum 2. 根据 sum, 锁定稀疏数组的行数 int sparseArr[][] = new int[sum + 1][3]; 其中原创 2020-10-26 15:27:11 · 94 阅读 · 0 评论