![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法 笔记
学习尚硅谷韩老师的课程,自己做一些笔记
青轴绕指柔
这个作者很懒,什么都没留下…
展开
-
希尔排序算法
一. 基本介绍在简单插入排序中,需要插入的数是较小的数时,后移的次数明显增多,对效率有影响。希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。二. 思想希尔排序法的基本思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。三. 代码实现package dat原创 2021-12-09 18:07:02 · 258 阅读 · 0 评论 -
插入排序算法
一. 基本介绍插入式排序属于内部排序法,是对于要排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。二. 思想插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。三. 代码实现package datastructure.sort;im原创 2021-12-09 16:17:33 · 123 阅读 · 0 评论 -
选择排序算法
一. 基本介绍选择式排序也属于内部排序法,是从要排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。二. 思路选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从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原创 2021-12-09 12:07:18 · 118 阅读 · 0 评论 -
冒泡排序算法
一. 思路冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使数值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。二. 代码实现package datastructure.sort;import java.u原创 2021-12-09 10:45:26 · 442 阅读 · 0 评论 -
常见的几种排序算法的时间复杂度
一. 排序算法的介绍概述:排序也称排序算法,排序是将一组数据,依指定的顺序进行排列的过程。排序的分类(1) 内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。(2) 外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。二. 时间复杂度的相关概念度量一个程序(算法)执行时间的两种方法。(1) 事后统计的方法(2) 事前估算的方法时间频度的介绍。 时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。原创 2021-12-08 19:18:55 · 7860 阅读 · 0 评论 -
八皇后问题
一. 八皇后问题介绍八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。二. 八皇后问题算法思路分析第一个皇后先放第一行第一列。第二个皇后放在第二行第一列、然后判断是否OK, 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适的位置。继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个原创 2021-12-08 16:36:14 · 134 阅读 · 0 评论 -
递归—迷宫问题
一. 迷宫图形描述红色方块代表墙体,红色小球代表走迷宫的人,箭头指向的位置为终点。二. 代码实现package datastructure.recursion;public class Maze { public static void main(String[] args) { // 用数组表示地图 初始化为0表示未走过 用数字1表示墙 用数字2标识已走过的路 用数字3标识走不通的路 int[][] map = new int[8][7];原创 2021-12-08 10:19:46 · 394 阅读 · 0 评论 -
递归的基本介绍
一. 递归的概念简单的说,递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。二. 递归调用规则当程序执行到一个方法时,就会开辟一个独立的空间(栈)。每个空间的数据(局部变量),是独立的。三. 递归解决的问题各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛)各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.将用栈解决的问题,使用递归代码比较简洁。四. 递原创 2021-12-08 09:31:27 · 240 阅读 · 0 评论 -
逆波兰计算器
一. 前缀、中缀、后缀表达式的基本介绍前缀表达式(1) 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前。举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6。(2) 前缀表达式求值:从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 和 次顶元素),并将结果入栈重复,上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。中缀表达式中缀表达式就是常见的运算表达式,如(3+4)×5-6原创 2021-12-07 17:40:55 · 198 阅读 · 0 评论 -
栈实现简答计算器
一. 思路分析通过一个index索引遍历(扫描)表达式。如果扫描到一个数字,就直接入数字栈(使用的栈是自己用数组模拟的栈)。如果扫描到一个符号就分以下情况:(1) 如果当前的符号栈为空,就直接入栈。(2) 如果符号栈有操作符,就进行比较,如果当前操作符的优先级小于或者等于栈中操作符的优先级,就需要从数字栈pop出两个数字,在符号栈中pop出一个符号,进行运算,将得到的结果存入数字栈。只有当前操作符的优先级大于栈中操作符的优先级,才会直接入符号栈。当表达式扫描完毕,就按顺序从数字栈和符号栈中po原创 2021-12-07 10:38:00 · 77 阅读 · 0 评论 -
数组模拟栈
一. 栈的介绍栈的英文为(stack)。栈是一个先入后出(FILO-First In Last Out)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。二. 栈的应用场景子程序的调用:在跳往子程序前,会先将下原创 2021-12-07 09:12:30 · 67 阅读 · 0 评论 -
约瑟夫问题
一. 基本介绍约瑟夫问题。Joseph问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。代码实现思路。用一个不带头结点的循环链表来处理Joseph问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点原创 2021-12-06 17:30:39 · 393 阅读 · 0 评论 -
双向链表中节点的增删改查
一. 基本介绍单向链表与双向链表的比较:(1) 查找的方向只能是一个方向,而双向链表可以向前或者向后查找。(2) 单向链表不能自我删除,需要依靠辅助节点 ,而双向链表,则可以自我删除。本次在节点中增加了指向前一个节点的指针,实现双向链表的增删改查操作。二. 代码实现节点package datastructure.linkedlist.doublelinkedlist;public class HeroNode { public int no; // 编号原创 2021-12-06 16:20:58 · 429 阅读 · 0 评论 -
单链表应用
一. 链表介绍链表是以节点的方式来存储的,是链式存储。每个节点包含data域和next域,next域指向下一个节点。链表的各个节点不一定是连续存储。链表分为带头节点的链表和没有头节点的链表,根据实际需求来确定。二. 单链表应用实例的代码实现节点package datastructure.linkedlist.simplelinkedlist;public class HeroNode { public int no; // 编号 public String n原创 2021-12-06 13:17:23 · 447 阅读 · 0 评论 -
数组模拟(环形)队列
一. 队列介绍队列是一个有序列表,可以用数组或是链表来实现。队列遵循先入先出的原则。即:先存入队列的数据要先取出,后存入的数据要后取出。二. 数组模拟队列思路队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中maxSize是该队列的最大容量。因为队列的输出、输入时分别从前后端来处理,因此需要两个变量front和rear分别记录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据输入而改变,如图所示:当我们将数据存入队列时称为“addQu原创 2021-12-06 10:49:27 · 615 阅读 · 0 评论 -
二维数组与稀疏数组之间的转换
稀疏数组的基本介绍:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:(1) 记录数组一共有几行几列,有多少个不同的值。(2) 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。举例说明:(1)普通数组:(2) 稀疏数组:思路及代码实现:思路。(1) 二维数组转稀疏数组的思路。① 遍历原始的二维数组,得到有效数据的个数 num。② 根据num创建稀疏数组sparseArr int[num+1]原创 2021-12-03 10:21:10 · 76 阅读 · 0 评论