
数据结构与算法
我就是个渴望成长的小菜鸡
如果你觉得我的文章对你有帮助,欢迎点赞和关注;如有异议,欢迎指出。我就是个渴望在学习中成长为一名合格的程序媛的小菜鸡
展开
-
赫夫曼树
构成赫夫曼树的步骤:从小到大进行排序,将每一个数据,每个数据都是一个节点,每个节点可以看成是一颗最简单的二叉树 取出根节点权值最小的两颗二叉树(即排序后的前两个数) 组成一颗新的二叉树,该新的二叉树的根节点的权值是前面两棵二叉树根节点权值的和 再将这颗新的二叉树,以根节点的权值大小再次排序,不断重复1-2-3-4步骤,直到数列中,所有的数据都被处理,就得到一颗赫夫曼树假设有一个数组 ...原创 2020-01-19 22:30:39 · 141 阅读 · 0 评论 -
顺序存储二叉树
从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。数组转换成树即是将数组中的各个元素按照二叉树的层次存储起来的过程。原数组:[1,2,3,4,5,6,7]转换为顺序二叉树如下图所示:顺序存储二叉树的特点:通常只考虑完全二叉树 第n个元素的左子节点为2*n+1 第n个元素的右子节点为2*n+2 第n个元素的父节点为(n-1)/...原创 2020-01-16 21:16:48 · 297 阅读 · 0 评论 -
前序,中序,后序查询指定的节点
前序查找的思路:先判断当前节点的no是否等于要查找的 如果相等,返回当前节点 如果不等,则判断当前节点的左子节点是否为空,如果不为空,则递归前序查找 如果左递归前序查找找到了节点,则返回,否则继续判断,当前节点的右子节点是否为空,如果不空,则继续向右递归前序查找中序查找的思路:判断当前节点的左子节点是否为空,如果不为空,则递归中序查找 如果找到,则返回,如果没找到,就和当前节点比...原创 2020-01-15 10:54:58 · 619 阅读 · 0 评论 -
二叉树
1.每个节点最多只能有两个子节点的一种形式称为二叉树2.如果二叉树的所有叶子节点都在最后一层,并且节点总数=2^n-1,n为层数,则我们称为满二叉树3.如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树二叉树的遍历:前序遍历:先输出父节点,再遍历左子树和右子树中序遍历:先遍历左子...原创 2020-01-14 22:08:22 · 171 阅读 · 0 评论 -
哈希表的底层实现
哈希表的底层是一个数组,数组中的每个元素对应了一个链表。package com.atguigu.hashtab;import java.util.Scanner;public class HashTabDemo { public static void main(String[] args) { //创建一个哈希表 HashTab hashTab=new HashTab(...原创 2020-01-13 23:09:22 · 1858 阅读 · 0 评论 -
插值查找算法
要求数组也是有序的,相比于折半查找(二分查找)来说,只是mid的计算方法不一样。Int mid=left+(right-left)*(val-arr[left])/(arr[right]-arr[left])插值查找注意事项:对于数据量较大,关键字(数组的值跳跃很大)分布比较均匀的查找表来说,采用插值查找,速度较快 关键字分布不均匀的情况下,该方法不一定比折半查找要好代码实现如下:...原创 2020-01-12 17:21:14 · 151 阅读 · 0 评论 -
二分查找升级版
当一个有序数组中,有多个相同的数值时,如何利用二分查找将所有的数值都找到??? 1.在找到mid时不要马上返回 2.可以向mid索引值的左边扫描,将满足等于val的值的下标加入到集合ArrayList中 3.可以向mid索引值的右边扫描,将满足等于val的值的下标加入到集合ArrayList中 4.返回ArrayList代码实现如下:package...原创 2020-01-12 12:38:43 · 325 阅读 · 0 评论 -
二分查找
思路分析:首先确定该数组的中间的下标 :mid=(left+right)/2,这里假设数组是从小到大的有序数组 然后让需要查找的数val和arr[mid]比较如果val>arr[mid],说明要查找的数在mid右边,因此需要向右查找 val<arr[mid],说明要查找的数在mid左边,因此需要向左查找 Val=arr[mid],说明找到,就返回方法一:用递归实现二分查找...原创 2020-01-12 11:37:03 · 118 阅读 · 0 评论 -
基数排序(桶排序)-----------这里只适用于正数,负数的使用范围后续再更新
准备一个大小为10(索引为0~9)的桶,取待排序数组中的每一位(从低位到高位)依次放到对应的桶中。流程:找到数组arr中的最大值,并求出最大值的位数,表示外层循环的次数 遍历数组,统计数组arr[i]对应的数字,并放到对应的桶中,同时统计当前桶存放的数字个数 将桶中的数据依次全部取出,放入原来的数组 重复进行第2、3、4步代码实现:package com.atguigu...原创 2020-01-11 23:14:45 · 797 阅读 · 0 评论 -
归并排序
归并排序是一个典型的基于分治的递归算法。它不断地将原数组分成大小相等的两个子数组(可能相差1),最终当划分的子数组大小为1时(即left小于right不成立时) ,将划分的有序子数组合并成一个更大的有序数组。归并排序思路分析:归并排序算法有两个基本的操作,一个是分,也就是把原数组划分成两个子数组的过程。另一个是治,它将两个有序数组合并成一个更大的有序数组。它将数组平均分成两部分: ce...原创 2020-01-11 13:50:00 · 252 阅读 · 0 评论 -
快速排序
排序算法采用了一种分治的策略,即将大模块划分成同样的小模块。快排的基本思想:先从数组中取出一个数作为基准数,通常取数组的第一个元素作为基准数 分区过程,将比基准数大的数放到他的右边,小于或等于他的数放到左边 经过一次分区后,便可以将原数组分成基准数的左边都小于等于基准数,而右边都大于基准数的数组。重复第2步的过程,直到区间只有一个数,最终就可以得到一个有序的数组快速排序实际上就是挖坑...原创 2020-01-09 21:44:02 · 116 阅读 · 0 评论 -
希尔排序
思路:采取跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。将待排序数组分组,分成gap组,先将分组最大化,即第一次分成gap=数组长度/2个小组,接下来每次在原来分组的基础上将小组数砍半 从第gap个元素开始,逐个对其所在组进行直接插入排序package com.atguigu.sort;impo...原创 2020-01-08 22:24:54 · 146 阅读 · 0 评论 -
插入排序
待排序数组arr(从小到大排序)假设有两个数组:有序数组arr1和无序数组arr2初始时的arr1只有一个元素,那就是待排序数组中下标为0的元素,即arr[0] 每次从arr2中取出来一个依次与arr1中的元素进行比较,如果arr2[i]<arr1[index],则当前arr1[index]后移一位,腾出一个空位给arr2[i],即arr1[index++]=arr1[index]...原创 2020-01-08 21:04:29 · 159 阅读 · 0 评论 -
选择排序
思路分析:原始数组arr 101 34 119 1第一轮排序:假设当前的arr[0]是最小值,i=0是最小值的索引。从arr[0]之后的元素中找出比arr[0]小的值进行交换,即将最小值放在arr[0]的位置,即1 34 119 101第二轮排序:假设arr[1]是最小值,从arr[1]以后的元素中找比arr[1]小的值进行交换,即1 34 119 101第三轮排序:1 34 ...原创 2020-01-07 22:24:59 · 92 阅读 · 0 评论 -
冒泡排序-----------改进版
分析思路:通过一个标志位记录当前数组是否是有序数组,标志位的初始值设为false,如果发生两个相邻元素的交换,则标志位置为true,说明当前数组数组不是有序的,因为还需要进行交换,反之,如果遍历下来,一次交换都没发生,说明当前数组已经有序,那么久不需要后续的排序算法。代码实现如下:package com.atguigu.sort;import java.util.Arrays;...原创 2020-01-07 21:27:41 · 171 阅读 · 0 评论 -
冒泡排序
冒泡排序规则:一共进行数组的大小减1次大的循环 每一趟排序的次数在逐渐的减少 如果发现在某趟排序中,没有发生一次交换,可以提前结束排序,这就是优化改进版的排序将在下一个博客中更新。代码实现如下:package com.atguigu.sort;import java.util.Arrays;public class BubbleSort { public stati...原创 2020-01-07 21:02:21 · 125 阅读 · 0 评论 -
八皇后问题
八皇后问题算法思路分析:第一个皇后先放在第一行第一列 第二个皇后放在第二行第一列,然后判断是否OK,继续放在第二列,第三列,依次把所有列都放完,找到一个合适的位置 继续放第三个皇后,还是第一列、第二列......直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正解,全部得到 然后回头继...原创 2020-01-06 21:43:52 · 133 阅读 · 0 评论 -
递归实现迷宫问题
这里以8*7的宫格为例,代码实现如下:package com.atguigu.recursion;public class MiGong { public static void main(String[] args) { //先创建一个二维数组,模拟迷宫 //地图 int[][] map=new int[8][7]; //使用1表示墙 //上下全部置为1 f...原创 2020-01-06 20:46:26 · 720 阅读 · 0 评论 -
栈-----------用数组模拟栈
数组模拟栈的思路分析图:实现栈的思路分析使用数组来模拟栈 定义提个top来表示栈顶,初始化为-1 入栈的操作,当有数据加入到栈时,top++,stack[top]=data; 出栈的操作,int value=stack[top];top--;return value;代码实现如下:package com.atguigu.stack;import java.util....原创 2020-01-05 15:00:36 · 144 阅读 · 0 评论 -
约瑟夫问题(单向环形链表的应用)
编号为k的人从1 开始报数,数到m的人出列,他的下一位又从1开始报数,数到m的人又出队列,依次类推,知道所有人都出队列,由此产生一个出队编号的序列。这里假设n=5,k=1,m=2。出队列的顺序: 2->4->1->5->3一、构建一个单向环形链表的思路:先创建第一个节点,让first指向该节点,并让该节点形成一个环形 后面,当我们每创建一个新的...原创 2020-01-04 22:58:21 · 177 阅读 · 0 评论 -
双向链表--------------增删改查
一、双向链表的查询思路:所谓查询操作其实就是实现双向链表的遍历1)遍历方式和单链表一样,只是可以向前也可以向后查找 public void list() { //判断链表是否为空 if(head.next==null) { System.out.println("链表为空"); return; } //因为头结点不能动,因此我们需要...原创 2020-01-04 11:08:59 · 332 阅读 · 0 评论 -
单链表常见面试题
一、获取单链表的节点个数思路:遍历链表 /** * head 链表头结点 * @param head * @return */ //方法:获取到单链表结点的个数(如果是带头结点的链表,不统计头结点) public static int getLength(HeroNode head) { if(head.next==null) { return...原创 2020-01-02 22:43:51 · 155 阅读 · 0 评论 -
单链表(单项链表)-------------增删改查操作
链表以节点的方式存储 每个节点包含data域和next域,next域指向下一个节点 链表的各个节点不一定是连续存储 链表分带头结点的链表和没有头结点的链表,根据实际需求确定定义节点类//定义HeroNode,每个HeroNode对象就是一个节点class HeroNode { public int no; public String name; public String...原创 2020-01-01 23:12:19 · 255 阅读 · 0 评论 -
稀疏数组
二维数组转稀疏数组的思路:1、遍历原始二维数组,得到有效数据的个数sum。2、根据sum就可以创建稀疏数组sparseArr[sum+1][3]。稀疏数组的第一行表示原始二维数组的行数、列数和有效值个数,其他行分别表示当前有效值所在的行、列和具体的值。3、将二维数组的有效数据存到稀疏数组。稀疏数组转二维数组:1、先读取稀疏数组的第一行,根据第一行的数据创建二维数组。2、依次...原创 2020-01-01 22:10:07 · 97 阅读 · 0 评论 -
使用数组模拟普通队列-------缺点是每个数组下标只能使用一次
思路如下:front:指向队列头的前一个位置,front的初始值是-1; rear:rear指向队列最后一个元素,rear的初始值是-1; 当队列满时,条件是rear==maxSize-1; 当队列为空时,条件是rear==front;5 添加一个数据到队列时,主要分为以下几个步骤:①判断队列是否已满 ②rear指向下一个位置:rear++; ...原创 2020-01-01 22:00:39 · 433 阅读 · 0 评论 -
使用数组模拟环形队列
思路如下(环形队列):front:front指向队列的第一个元素,即arr[front]就是数组的第一个元素,front的初始值是0; rear:rear指向队列最后一个元素的后一个位置,因为希望空出一个空间作为约定,rear的初始值是0; 当队列满时,条件是(rear+1)%maxSize==front;(即front和rear位置相邻) 当队列为空时,条件是rear==fr...原创 2020-01-01 21:42:57 · 656 阅读 · 0 评论