数据结构和算法
@insist123
流年笑掷,未来可期!
展开
-
树结构---实例应用(堆排序)
堆排序的基本介绍: 1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(n㏒n)它也是不稳定排序,它也是不稳定排序 2)堆是具有以下性质的完全二又树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆,注意:没有要求结点的左孩子的值和右孩子的值的大小关系. 3)每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆 4)大顶堆举例说明 ...原创 2020-06-06 15:52:13 · 567 阅读 · 0 评论 -
树结构---二叉树---线索化二叉树介绍and中序遍历线索化二叉树
线索化二叉树的基本介绍: 1) n个结点的二叉链表中含有n+1 【公式2n-(n-1)n+1】个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索") 2)这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)根据线索性质的不同,线索二又树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种 3)一个结点的前一个结点,称为前驱结点 ...原创 2020-06-03 20:54:45 · 191 阅读 · 0 评论 -
树结构---二叉树---删除结点and顺序存储二叉树
应用实例要求: 如果删除的是叶子节点,则删除该节点 如果删除的节点是非叶子节点,则删除该子树 测试,删除掉5号叶子节点和三号叶子节点吧 思路分析: 首先要考虑二叉树是不是空树(root),如果只有root节点,则等价将二叉树置空 否则进行如下操作: 1.因为我们的二叉树是单向的,所以我们是判断当前节点的子节点是否需要删除节点,而不能去判断当前这个节...原创 2020-05-31 15:06:04 · 315 阅读 · 0 评论 -
树结构---二叉树---二叉树前中后序的遍历
为什么需要需要树这种数据结构: 1)数组存储方式的分析 优点:通过下标方式访问元素,速度快,对于有序数组,还可使用二分查找提高检索"速度 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 2)链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)...原创 2020-05-25 23:51:49 · 752 阅读 · 0 评论 -
数据结构---哈希表
哈希表的基本介绍: 散列表( Hash table,也叫哈希表)是根据关键码值(key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。应用实例: 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,姓名),当输入该员工的id时,要求查找到该员工的所有信息.要求: 不使用数据库,速度越快越好=>哈希表(散列)添加时,保...原创 2020-05-23 14:08:23 · 3405 阅读 · 0 评论 -
查找算法---插值查找算法and斐波那契查找算法
插值查找原理介绍: 1)插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找 2)将折半查找中的求mid 索引的公式, low表示左边索引, high表示右边索引. 3)int midindex =low + (high-low) * (key - arr(low) / (arr[high]-arr[low); /"插值索引*/ 4)举例说明插值查找算法1-100的数组package com.alibaba.searc...原创 2020-05-17 10:49:56 · 507 阅读 · 0 评论 -
查找算法---线性查找and二分查找
线性查找算法: 有一个数列:{1,8,10,89,1000,1234},判断数列中是否包含此名称【顺序查找】要求找到了,就提示找到了,并给出下标值。代码实现:package com.alibaba.search;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class SeqSearch { public static void main(Strin...原创 2020-05-13 22:06:30 · 176 阅读 · 0 评论 -
排序算法--基数排序
基数排序(桶排序)的介绍: 1)基数排序(radix sort)属于“分配式排序" (distribution sort) ,又称“桶子法” (bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用 2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法 3)基数排序...原创 2020-05-06 21:57:50 · 171 阅读 · 0 评论 -
快速排序and归并排序
快速排序法介绍: 快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 快速排序法应用实例: 对[-9,78,0,70,-567,...原创 2020-05-02 16:15:21 · 143 阅读 · 0 评论 -
插入排序and希尔排序
选择排序的基本介绍: 选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。 选择排序的思想: 选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]~arr[n-1]中选取...原创 2020-04-29 21:26:06 · 123 阅读 · 0 评论 -
排序算法(介绍分类)---冒泡排序and选择排序
排序算法介绍: 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。排序的分类: 1)内部排序 指将需要处理的所有数据都加载到内部存储器中进行排序。 2)外部排序法 指数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。 3)常见的排序...原创 2020-04-29 14:51:29 · 240 阅读 · 2 评论 -
算法的时间复杂度及空间复杂度的简单介绍
算法的时间复杂度: 度量一个程序(算法)执行时间的两种方法: 1)事后统计的方法 这种方法可行,但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依 赖于计算机的硬件、软件等环境因素,这种方式,要在同一台计算机的相同状态下运行,才能比较哪个算法速度更快。 2)...原创 2020-04-28 22:31:00 · 524 阅读 · 0 评论 -
回溯算法解八皇后问题(java)
八皇后问题介绍: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8x8的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多种摆法。八皇后问题算法思路分析: 1)第一个皇后先放第一行第一列 2)第二个皇后放在第二行第一...原创 2020-04-24 21:23:06 · 198 阅读 · 0 评论 -
算法编程迷宫问题(java)
如上图一迷宫,我们需要做的就是将小球从起点位置,移动到终点位置,利用二维数组和递归简单实现 思路分析: 1.地图用一个二维数组表示 map 1.i,j 表示从地图哪个位置开始出发(1,1) ...原创 2020-04-22 22:11:57 · 594 阅读 · 0 评论 -
逆波兰表达式计算器
前缀、中缀、后缀表达式(逆波兰表达式): 前缀表达式:又称波兰表达式,前缀表达式的运算符位于操作数之前 举例:(3+4)*5-6,对应的前缀表达式为- * + 3 4 56 中缀表达式:就是常见的运算表达式,如:(3+4)*5-6 后缀表达式:又称为逆波兰表达式,与前缀表达式相似,只是运算符...原创 2020-04-10 22:20:22 · 524 阅读 · 0 评论 -
利用栈实现综合计算器
使用栈完成表达式的计算器思路分析: 1.通过一个index值(索引),来遍历我们的表达式 2.如果发现是一个数字,就直接入栈 3.如果发现扫描到是一个符号,就要分情况了 如果发现当前的符号栈里为空,就直接入栈; ...原创 2020-04-09 22:24:16 · 283 阅读 · 0 评论 -
单向循环链表(约瑟夫问题)
Josephu(约瑟夫,约瑟夫环)问题: 设编号为1,2,......n的n个人围坐在一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,以此类推,直到所有人出列为止,由此产生一个出队编号的序列。 提示:用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n...原创 2020-04-08 20:52:23 · 219 阅读 · 0 评论 -
快速操作双向链表
什么是双向链表? 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 双向链表结构: 关于双向链表操添加操作分析: ...原创 2020-04-07 22:19:07 · 195 阅读 · 0 评论 -
合并两个有序的单链表,合并之后的链表依然有序
在上一篇文章中我有写到怎么将节点有序的添加到单链表中 https://blog.csdn.net/weixin_44076260/article/details/105315461思路分析: ·先定义一个头节点 ·...原创 2020-04-07 14:49:23 · 774 阅读 · 8 评论 -
链表(Linked list)
链表是有序的列表 内存中的存储如下图 小结:链表是以节点的方式来存储的,是链式存储;每个节点包含data域,next域:指向下一个节点; 如图:发现链表的各个节点不一定是连续存储的;链表分带头节点和没有头节点的链表 单链表介绍:...原创 2020-04-04 22:52:42 · 162 阅读 · 0 评论 -
队列
队列介绍: ·队列是一个序列表,可以用数组或是链表来实现 ·遵循先入先出原则数组模拟队列: 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列的声明如下图,其中maxsize是该队列的最大容量 因为队列的输出、输入是分别从前后端来处理的,因此需要两个变量front及rear分别记录队列的前后端的下标,fro...原创 2020-04-04 14:30:08 · 125 阅读 · 0 评论 -
五子棋存档(二维数组《=》稀疏数组)
案例分析1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等)2)把稀疏数组存盘,并且可以从新恢复原来的二维数组数3)思路分析代码实现:package com.alibaba.sparsearray;import java.io.*;public class SparseArray { public static void main(String[] ar...原创 2020-04-02 22:12:49 · 362 阅读 · 0 评论