
数据结构与算法
文章平均质量分 71
数据结构与算法学习笔记
Zhang_960110
写博客的初衷:记录自己学习、思考、总结的过程;建立自己知识库,分类汇总保留。
展开
-
排序算法 - 堆排序详解
预备知识堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。如图:同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子特点该数组从逻辑上讲就是一个堆结构,要查找数组中某个数的父结点和左右孩子结点,设数组索引为i,那么父结点索引:(i-1)/2左孩子索引:2*i+1右孩子索引:2*i+2可得大顶堆特点原创 2022-05-17 21:20:45 · 3541 阅读 · 2 评论 -
数据结构 - 哈希表
基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。数组 + 链表实例有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id、性别、年龄、住址……),当输入该员工的id时,要求查找到该员工的所有信息。要求:不使用数据库,尽量节省内存,速度越快越好 => 哈希表(散列表)。员工实体类Employe原创 2022-05-13 23:13:09 · 618 阅读 · 0 评论 -
查找算法:顺序(线性)查找、二分(折半)查找、插值查找
文章目录顺序查找二分查找插值查找斐波那契查找顺序查找依次遍历数据,查找到就返回下标,没有查找到就返回-1/** * @ClassName SeqSearch * @author: shouanzh * @Description 线性查找 * @date 2022/5/11 16:44 */public class SeqSearch { public static void main(String[] args) { int[] array = new int[原创 2022-05-12 20:15:00 · 517 阅读 · 2 评论 -
排序算法 - 基数排序详解
基本介绍基数排序(radix sort)的思想是多关键字排序,属于分配式排序。它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,然后依次收集各个桶内数据,通过分配和收集达到排序的目的。基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序示意图:执行流程下面通过一个例子来体会基数排序过程。原始序列:80, 43, 155, 987, 100, 31, 6, 299, 155, 00)初始桶每个关键字的每一位都是由“原创 2022-05-10 22:21:31 · 3894 阅读 · 1 评论 -
排序算法 - 归并排序详解
基本介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。基本思想将序列中待排序数字分为若干组,最终每个数字分为一组。(默认长度为1的序列是有序的)将若干个组两两合并,保证合并后的组是有序的。(俩个子序列头部进行比较大小)重复第二步操作直到只剩下一组,排序完成。归并排序思想示原创 2022-05-09 22:38:42 · 4718 阅读 · 0 评论 -
排序算法 - 快速排序详解
基本思想对于一组数据,选择一个基准元素(base),通常选择第一个或最后一个元素,通过一轮扫描,比base小的元素都在base左边,比base大的元素都在base右边,对左右子序列用相同的方法递归排序,直到序列中所有数据均有序为止。快速排序,说白了就是给基准数据找其正确索引位置的过程。思路图解以 [19,97,09,17,01,08] 为例,以第一个元素19为base,定义左右两个指针 L和 R,分别从两端开始扫描。从右向左找比19小的数,替换L所在位置的元素。再从左往右找比19大的数,然后替换原创 2022-05-08 19:35:30 · 1326 阅读 · 0 评论 -
排序算法 - 希尔排序
基本介绍简单插入排序存在的问题:数组 array = {2,3,4,5,6,1} 这时需要插入的数 1 (最小),这样的过程是:{2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6}结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响。希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更原创 2022-05-06 23:26:35 · 227 阅读 · 0 评论 -
排序算法 - 插入排序
基本介绍插入式排序属于内部排序法,是对于待排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序法思想插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。插入排序(图解)代码实现/** * @ClassName InsertSo原创 2022-05-06 20:45:00 · 178 阅读 · 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原创 2022-05-06 08:00:00 · 154 阅读 · 0 评论 -
排序算法 - 冒泡排序
基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对 需要排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。如果有 n 个数进行排序,只需将 n-1 个数归位,也就是要进行 n-1 趟操作。而 “每一趟 ” 都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后原创 2022-05-05 23:00:00 · 936 阅读 · 0 评论 -
算法的时间复杂度
文章目录1.度量一个程序(算法)执行时间的两种方法1.1 事后统计的方法1.2 事前估算法2.时间频度2.1 特点2.1.1 举例说明—忽略常数项2.1.2 举例说明—忽略低次项2.1.3 举例说明—忽略系数3.时间复杂度3.1 常见的时间复杂度3.2 常数阶O(1)3.3 对数阶O(log~2~n)3.4 线性阶O(n)3.5 线性对数阶O(nlog~2~n)3.6 平方阶O(n²)3.7 立方阶O(n³)、K次方阶O(n^k^)4.平均时间复杂度和最坏时间复杂度5.空间复杂度1.度量一个程序(算法)执原创 2022-05-04 17:30:44 · 720 阅读 · 0 评论 -
递归详解及迷宫问题和八皇后问题
递归概述递归就是方法自己调用自己。递归必须具备两个条件,一个是调用自己,一个是有终止条件。这两个条件必须同时具备,且一个都不能少。并且终止条件必须是在递归最开始的地方,也就是下面这样public void recursion(参数0) { if (终止条件) { return; } recursion(参数1);}递归调用机制递归调用机制(栈的运行原理):JVM直接对Java栈的操作只有两个,就是对栈帧的压栈和出栈,遵循“先进后出”/“后进先出”原原创 2022-05-02 22:31:33 · 485 阅读 · 0 评论 -
前缀、中缀、后缀表达式及逆波兰计算器实现
文章目录1.前缀表达式(波兰表达式)1.1 介绍1.2 前缀表达式的计算机求值2.中缀表达式3.后缀表达式(逆波兰表达式)3.1 介绍3.2 后缀表达式的计算机求值4.逆波兰计算器5.中缀表达式转换为后缀表达式5.1 思路分析5.2 代码实现6.完整版逆波兰计算器1.前缀表达式(波兰表达式)1.1 介绍前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前。举例说明:(3+4)*5-6 对应的前缀表达式就是 - * + 3 4 5 61.2 前缀表达式的计算机求值从右至左扫描表达式,遇到数字原创 2022-05-01 21:53:13 · 1217 阅读 · 0 评论 -
数据结构 - 栈(Stack)
文章目录栈的介绍用数组模拟栈栈实现计算器栈的介绍栈的英文为(stack)。栈是一个先入后出(FILO : First In Last Out)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊的线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶;而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。入栈(push)示原创 2022-04-30 21:32:54 · 2930 阅读 · 0 评论 -
数据结构 - 约瑟夫环
文章目录约瑟夫问题由来约瑟夫环介绍单向环形列表约瑟夫问题由来据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越原创 2022-04-29 23:30:32 · 875 阅读 · 0 评论 -
数据结构 - 双向链表
文章目录双向链表特点双向链表增、删、改、查、图解分析双向链表增、删、改、查、代码实现双向链表特点单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp(temp是待删除节点的前一个节点),temp.next = temp.next.next 。双向链表增、删、改、查、图解分析一、遍历方法和单链表一样,只是可以向前遍历,也可以向后遍历。二、添加 (默认添加到双向链表原创 2022-04-29 22:30:00 · 468 阅读 · 0 评论 -
数据结构 - 单链表
文章目录链表(Linked List) 介绍单链表创建和遍历的分析与实现单链表:按顺序插入、删除、修改、判重获取单链表中有效节点的个数查找单链表中的倒数第k个结点单链表的反转从尾到头打印单链表链表(Linked List) 介绍链表是有序的列表,但是它在内存中是存储如下链表是以节点的方式来存储,是链式存储。每个节点包含 data域:存放数据, next 域:指向下一个节点。如图:发现链表的各个节点不一定是连续存储。链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。单链表(带头原创 2022-04-29 00:46:22 · 3032 阅读 · 0 评论 -
数据结构 - 队列 && 环形队列(循环队列)
文章目录队列介绍数组模拟队列数组模拟队列设计思路数组模拟环形队列队列介绍队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。数组模拟队列队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 MaxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改原创 2022-04-27 00:01:58 · 3399 阅读 · 0 评论 -
稀疏数组 - SparseArray
文章目录基本介绍二维数组转稀疏数组稀疏数组转二维数组基本介绍对于二维数组中如果有多数数据为相同的值,少数为有效值的数组,可以通过稀疏数组进行重新存储,达到较少空间占用,后面可以通过这个稀疏数组恢复之前的二维数组。稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值。把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。举例说明比如一个棋盘,可以用二维数组表示,这个棋牌(只有三种数据,0为没有棋子,1为黑棋,2为蓝棋)如图,把一个11 X 11的二维数组变为原创 2022-04-26 20:30:45 · 265 阅读 · 0 评论