![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 56
meng_hc
不积跬步无以至千里,不积小流无以成江海。
展开
-
查找算法之三:斐波那契查找(黄金分割法)
斐波那契查找思路分析代码实现思路分析FibonacciSearch(也叫黄金分割法)的思路分析:==>实际上,这也是一个基于二分查找(也就是折半查找)的查找算法。只是在计算mid 的值时,加入了斐波那契数列的性质在里边:1、由于斐波那契数列中,后一个元素与前一个元素之比,接近于0.618的黄金分割比例,该查找算法就借助斐波那契数列来帮助每一次mid的确认【mid取的是:无限接近于黄金分割点的位置的坐标】2、因为斐波那契数列的迭代公式为:f(k) = f(k-1) + f(k-2);所以原创 2021-06-09 18:01:17 · 477 阅读 · 0 评论 -
查找算法之二:插值查找
插值查找思路分析代码实现思路分析插值查找是基于二分查找进行的优化,基本思路与二分查找的一致,只是在进行划分时mid的确定不同:==>插值查找采取的是一种 自适应mid的计算方法:mid = left + (right - left) * (findval - arr[left])/(arr[right] - arr[left])含义:根据findVal 与 arr[left]的差值,在arr[right] - arr[left]中所占据的比例,来确定findVal在待查找序列中可能对应的原创 2021-06-09 16:32:40 · 248 阅读 · 0 评论 -
查找算法之一:二分查找(递归实现)
二分查找的递归实现思路分析代码实现思路分析1、确定该序列的中间的下标mid:mid = (left + right)/2;2、让需要查找的数findVal 与 arr[mid]进行比较:(1)findVal > midVal,则进行向右递归,查找findVal;递归的边界条件是:mid+1,right(2)findVal < midVal,则进行向左递归,查找findVal;递归的边界条件是:left,mid-1(3)findVal == midVal,则表明找到了待查找的f原创 2021-06-09 15:54:32 · 13095 阅读 · 3 评论 -
八大排序算法之七:基数排序
算法思想思想:通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。=>将所有的待比较数值统一为同样的数位长度,数位较短的数前面补0。然后,从最低位开始,依次进行排序(每一位进行一次,一共有多少位,就进行多少次排序)。基数排序的实现思路:用于排序过程的“桶”假设用于排序的数均为正整数,那么在这里设置桶的个数为10。又因为每个桶,实际上也是一个一维数组。所以,定义一个二维数组,来实现排序过程中对于“桶”的要求:int[][] bucket = new int[10原创 2021-06-03 17:06:51 · 217 阅读 · 0 评论 -
八大排序算法之六:快速排序(以中轴值作为排序基准)
算法思想快速排序是对冒泡排序的一种改进:通过一趟排序,将要排序的数据分割成独立的2部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以达到整个数据变成有序序列。快排(以中轴数作为基准)的实现:对序列进行处理的操作,目的是:依据选择的基准(这里采用的是中轴值pivot),将序列切分称为两个子序列(因为是依照值进行切分的,所以两个子序列大小不一定相等)具体的实现方式:① 定义两个指针l、r,其中,l的初值为lef原创 2021-06-03 16:02:52 · 4095 阅读 · 2 评论 -
八大排序算法之五:归并排序
算法思想归并的思想归并排序(merge-sort)是利用归并的思想实现的排序算法,该方法采用经典的分治(divide-and-conquer)策略:分治法将问题分(divide)成一些小的问题,然后递归求解。而治(conquer)的阶段则将分的阶段得到的各答案“修补”在一起。=>即:分而治之。实现要点归并算法的实现,分为两个过程:分、合“分”的过程:=>也就是实现递归调用的过程。1)确定递归的终止条件:left >= right只有待划分序列的左侧索引 left ,小于原创 2021-06-03 09:20:37 · 111 阅读 · 0 评论 -
八大排序算法之四:希尔(shell)排序----直接插入排序的改进
算法思想:希尔排序的实现思想:希尔排序,也可以称为:缩小增量排序。实际上,就是在直接插入排序的基础上进行优化,对于要进行插入排序的数组,先进行了分组,通过实现分组内的插入排序,让每一组数现在本组内实现有序。然后,通过缩小增量gap(也叫步长)将分组数逐渐减小。=> 因为前面已经实现了:各个分组内的数有序,所以,即使分组的方法改变导致新形成的分组中的数有变化,但是新的分组中的数已经比最初的时候有序了。=> 对于新的分组内的数,进行插入排序。······=> 最终,当gap=原创 2021-06-01 16:23:24 · 226 阅读 · 0 评论 -
八大排序算法之三:直接插入排序
算法思想直接插入排序的思想:将数组理解为两个列表:有序列表、无序列表有序列表的最初状态,只包含数组中的第一个元素无序列表的最初状态,包含arr[0]之外的其他所有数组元素按照数组的索引递增的顺序,逐渐将无序列表中的元素加入到有序列表中=>外层循环for(int i=1;i<arr.length;i++)对于要进行插入的元素arr[i],进行如下操作:1)暂存arr[i]为insertVal,2)逆向遍历有序列表,直到找到 第一个值小于insertVal的元素,那么,inse原创 2021-06-01 16:10:00 · 89 阅读 · 0 评论 -
八大排序算法之二:简单选择排序
算法思路选择排序的实现思想:假定实现的是:从小到大的排序在每趟排序中,设置两个变量:min、minIndex。对于n个数据,需要进行n-1趟排序。每趟排序,最终确定一个在本趟排序中最小的数,放在minIndex的位置上(实现只有这两个位置的 交换操作)对于第i趟排序,是从第i+1个数据开始,向后遍历,确定该趟排序中最小的数据并使用min保留其值、minIndex保留它的数组索引值,最终:arr[i]与arr[minIndex]进行交换。算法实现 public static void sel原创 2021-06-01 15:56:49 · 94 阅读 · 0 评论 -
八大排序算法之一:冒泡排序
算法思路冒泡排序的主要思想:类似于水的泡泡一样,假设是按照从小到大排列,那么,每排一趟,在数组的末尾就有一个大数的位置被确定了。 并且,在每一趟排序的过程中,都只是只能交换相邻的两个元素要点如下:对于n个元素的排序,要进行n-1趟对于第i趟排序,j的限制条件为:j<length-1-i个,因为每一次排序针对第j个数,实际上比较的是第j和第j+1个数的大小关于冒泡的简单优化:* 设置一个flag标志,初始值为false,如果在一趟排序的过程中,进行了“交换相邻元素”的操作,就将该标志的值原创 2021-06-01 10:24:32 · 63 阅读 · 0 评论 -
迷宫回溯问题
回溯算法的经典问题之一:迷宫问题问题说明:解题思路:代码实现:问题说明:左上角为入口,右下角为出口。设置小球寻找路径的策略为:下=>右=>上=>左。编写代码,输出小球寻找到的走出迷宫的路径。解题思路:迷宫回溯问题的解题主要分为两部分:首先需要在main()中,设置迷宫的形状:通过一个二维数组来实现迷宫的存储对于二维数组中的每一个元素arr[i][j],通过设置该元素的值(0、1、2、3),可以表示该元素对应的迷宫中的位置的情况:1:该位置存在挡板,不可以走;原创 2021-05-30 21:44:22 · 266 阅读 · 0 评论 -
回溯法经典案例:8皇后问题----用一维数组来实现
以前解决8皇后问题,使用的都是二维数组,比较麻烦。最近在看数据结构与算法的时候,学习到了用一维数组解决8皇后问题的解法,下面总结一下:8皇后问题在8*8的国际想起上拜访八个皇后,使其不能相互攻击。即:任意2个皇后,都不能处于同一行、同一列、或统一斜线上,问有多少种摆法?分析这种解决方式的实现,依赖于一个一维数组:int[] arr = new int[max];1、该数组用来存储每个皇后所对应的列数即:val = arr[i] ,val就表示第 i 个皇后(从0 开始计数),放置在第 i 行原创 2021-05-30 12:47:42 · 759 阅读 · 1 评论 -
逆波兰计算器----输入算式,实现整数的四则运算(包含小括号)
在进行计算时,计算机与人不一样。相比较中缀表达式,它采用后缀表达式计算起来要明显方便许多。下面就用 java + 栈 ,实现:对于输入的算式,转化为对应的后缀表达式,并且计算出算式值 的功能:思路梳理处理的主要思路为:1、将输入的expression(中缀表达式)进行转换 => 中缀表达式对应的ArrayList类的list,便于在由中缀表达式转换为后缀表达式的过程中,进行遍历操作:1.1 需要注意的是:* 1) 在转换的过程中,分为两种情况:* 是运算符,直接add到list中;原创 2021-05-27 15:54:04 · 267 阅读 · 0 评论 -
逆波兰计算器(后缀计算器)的实现------输入后缀表达式
/*对于输入的逆波兰表达式(后缀表达式)操作的原则如下:1、创建一个栈stack的对象,用来存储从后缀表达式中读取到的数2、处理逆波兰表达式:2.1从左至右扫描表达式,如果遇到 数字,就将数字压入堆栈;如果遇到 运算符,就从数栈中pop()出来栈顶元素、次顶元素:num1、num2。进行相应运算,并将运算的结果压入数栈2.2扫描到expression的最右端时,数栈中保存的数,就是最终的结果*//** 处理的思路为:* 1、将expression先转化为对应的list,方便后.原创 2021-05-26 21:13:33 · 86 阅读 · 0 评论