数据结构
数据结构java
F班的小夏同学
理想主义青年永远不会被现实招安
展开
-
图的深度优先遍历和广度优先遍历
图遍历介绍所谓图的遍历,既是对节点的访问。一个图有那么多个结点,如果遍历这些结点,一般有两种访问策略:(1)深度优先遍历(2)广度优先遍历深度优先遍历package com.xxxx.graph;import java.util.ArrayList;import java.util.Arrays;public class Graph { private ArrayList<String> vertexList;//存储顶点的集合 private int[][] edg原创 2022-02-17 22:01:14 · 218 阅读 · 0 评论 -
图储存为邻接矩阵
package com.xxxx.graph;import java.util.ArrayList;import java.util.Arrays;public class Graph { private ArrayList<String> vertexList;//存储顶点的集合 private int[][] edges;//存储图对应 的邻结矩阵 private int numOfEdges;//表示边的数目 public static void main(Stri原创 2022-02-17 21:58:11 · 91 阅读 · 0 评论 -
图的初步了解
为什么要有图?我们之前学过线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时,这里我们用到了图基本介绍图是一种数据结构,其中结点可以具有零个或多个相邻的元素。两个结点之间的连接成为边。节点也可以称为顶点。如图:#### 图的基本概念顶点边路径无向图有向图带权图图的表示方式图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)邻接矩阵是表示图形中顶点之间相邻关系的矩阵。邻接表-邻接原创 2022-02-17 21:57:03 · 175 阅读 · 0 评论 -
二叉排序树
基本介绍对于二叉排序树的任何一个非叶子节点,要求左子结点的值比当前节点的值小,右子结点的值比当前节点的值大。如果有相同的值,可以将该节点放在左子结点或者右子结点。二叉排序树的删除二叉排序树的删除情况比较复杂,有下面三种情况需要考虑删除叶子节点(比如:2,5,9,12)删除只有一颗子树的节点(比如:1)删除有两颗子树的节点(比如:7,3,10)package com.xxxx.binarysorttree;public class BinarySortTreeDemo {原创 2022-02-17 10:21:15 · 159 阅读 · 0 评论 -
哈夫曼树的构建
几个名词==路径==:在一个树中,一个结点到另一个结点之间的通路,称为路径。图中,从根节点到结点a之间的通路就是一条路径。路径长度:在一条路径中,每经过一个结点,路径长度都要加一。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第i层的路径长度为i-1。图中从根结点到节点c的路径长度为3.结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。例如,图中结点a的权为7,b的权为5.结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。例如在图中,结点b的带权路径长原创 2022-02-16 11:24:22 · 208 阅读 · 0 评论 -
堆排序---java
在之前的博客中我们说过其他排序,但是没有说堆排序,因为堆排序运用到了树的知识。今天我们来说说使用堆排来进行排序。基本介绍代码实现package com.xxxx.tree;public class HeapSort { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr= {1,3,5,7,10}; heapSort(arr);原创 2022-02-15 15:39:13 · 208 阅读 · 0 评论 -
二叉树的遍历、查找与删除
为什么需要树这种数据结构?(1)数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会在整体移动,效率较低。(2)链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个节点,只需要将插入节点链接到链表即可,删除效率也很好)缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)(3)树存储方式的分析能提高数据存储,读取的效率,比如利用二叉排序树,既可以保证数据的检原创 2022-02-14 16:00:23 · 314 阅读 · 0 评论 -
哈希表----java
基本介绍散列表(哈希表)是根据关键码值而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。谷歌案例![image-20220212095641657](https://img-blog.csdnimg.cn/img_convert/9da850cbe0eeff29fa0e1ed5650fdff1.png)package com.xxxx.hashtable;import java.util原创 2022-02-12 19:30:30 · 80 阅读 · 2 评论 -
查找算法----java
在java中,我们常用的查找有是四种:顺序(线性)查找二分查找/折半查找插值查找斐波那契查找(黄金分割点查找线性查找public static int seqSearch(int[] arr,int val) { for(int i=0;i<arr.length;i++) { if(arr[i]==val) { return i; } } return -1; }二分查找public static int binarySearch(int[]原创 2022-02-11 17:18:41 · 58 阅读 · 0 评论 -
java实现基数排序
基本介绍技术排序属于“分配式排序”,又称“桶子法”,顾名思义,他是通过键值的各个位的值,将要排序的元素分配至某些“桶中”,达到排序的作用基数排序是稳定性的排序,基数排序法的是效率更高的稳定性排序基数排序是桶排序的扩展将整数按位数分成不同的数字public static void radixSort(int[] arr) { int max=arr[0];//假设第一个数就是最大数 for(int i=1;i<arr.length;i++) { if(arr[i]原创 2022-02-11 11:05:37 · 1300 阅读 · 3 评论 -
java实现归并排序
基本介绍归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。public static void sort(int []arr){ int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间 sort(arr,0,arr.length-1,temp); } private原创 2022-02-11 11:03:52 · 127 阅读 · 0 评论 -
java实现快速排序
基本介绍快速排序是对冒泡排序的一种改进,基本思想 是:通过一趟排序将要排序的数据分割成的独立的两部分,其中一部分的所有数据都比另一部分的所以数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。public static void quickSort(int[]arr,int left,int right){ if(left>=right){ //递归退出条件 return; }原创 2022-02-11 11:02:28 · 204 阅读 · 0 评论 -
java实现希尔排序
基本介绍希尔排序也是一种插入排序,他是简单插入排序经过改进之后的一个更高校的版本,也成为缩小增量排序。//希尔排序(交换式)(效率低)public static void shellSort(int[] arr) { int temp=0; int count=0; //说明:类似于插入排序,希尔排序是特殊的插入排序,将无序插入到有序序列中,只是假定有序序列为第一个步长中的数据。 //步长逐步/2 for(int gap=arr.length/2;gap>0;ga原创 2022-02-11 11:01:14 · 383 阅读 · 0 评论 -
java实现插入排序
基本介绍插入排序属于内部排序法,是对于待排序的元素以插入的方式找寻该元素的适当位置,已达到排序的目的。public static void insertSort(int[] arr) { for(int i=1;i<arr.length;i++) { //定义待插入的数 int insertVal=arr[i]; //定义用于比较的数下标 int insertIndex=i; //给insertVal找到插入的位置 /* * 说明原创 2022-02-11 10:59:12 · 432 阅读 · 0 评论 -
java实现选择排序
基本介绍选择排序也属于内部排序法,是从待排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到的排序的目的。public static selectSort(int[] arr){ for(int i=0;i<arr.length-1;i++){ int min=arr[i]; int minindex=i; for(int j=i+1;j<arr.length;j++){ if(arr[j]<原创 2022-02-11 10:56:37 · 427 阅读 · 0 评论 -
java实现冒泡排序
基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移到后面,就像水底下的气泡一样往上冒public static void bubbleSort(int[] arr){ for(int i=0;i<arr.length-1;i++){ //冒泡次数 //冒泡步骤 for(int j=0;j<arr.le原创 2022-02-11 10:54:45 · 228 阅读 · 0 评论 -
递归解决迷宫问题和八皇后问题
迷宫问题package com.xxxx.recursion;public class MiGong { public static void main(String[] args) { // TODO Auto-generated method stub //先创建一个二维数组,模拟迷宫 //地图 int[][] map=new int[8][7]; //使用1表示墙 //上下全部置为1 for(int i=0;i<7;i++) { map[0][i]=原创 2022-02-09 11:01:47 · 73 阅读 · 0 评论 -
前缀、中缀、后缀表达式
文章目录前缀表达式中缀表达式后缀表达式中缀表达式转为后缀表达式逆波兰计算器前缀表达式前缀表达式又称波兰式,前缀表达式的运算符位于操作符之前前置表达式的计算机求值:从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对他们做相应的计算(栈顶元素和次顶元素),并将结果存入;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果中缀表达式中缀表达式就是常见的运算表达式,如(3+4)*5-6中缀表达式的求值使我们最熟悉的,但是对于计算机来说却不好操作原创 2022-02-08 16:36:36 · 434 阅读 · 0 评论 -
栈和栈实现综合计算器
栈栈的介绍栈的英文(stack)栈是一个先入后出的有序列表栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底。根据栈的定义,最先放入栈中元素在栈底,最后放入栈中元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除实现栈的思路分析1.使用数组来模拟栈2.定义一个top来表示栈顶,初始化为-13.入栈的操作,当有数据加入到栈时,top++;stack[top]=da原创 2022-02-07 22:14:23 · 414 阅读 · 0 评论 -
环形链表和约瑟夫问题
环形链表和约瑟夫问题约瑟夫问题的描述解题思路约瑟夫问题的描述设置编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,他的下一位又从1开始报数,数到m的那个人又出列,以此类推,直到所有人出列为止,由此产生一个出圈的编号的序列。解题思路构建一个单向的环形链表思路:先创建第一个节点,让frist指向该节点,并形成环形后面当我们每创建一个新的节点,就把该节点,加入到已有的环形链表中遍历环形链表先让一个辅助指针(变量)cur原创 2022-02-07 11:23:18 · 50 阅读 · 0 评论