算法与数据结构
文章平均质量分 66
_码农耕地人
这个作者很懒,什么都没留下…
展开
-
动态规划实现最大字段和
一)问题描述:给定长度为n的整数序列,a[1...n], 求[1,n]某个子区间[i , j]使得a[i]+…+a[j]和最大.求出最大的这个和.例如(-2,11,-4,13,-5,2)的最大子段和为20,所求子区间为[2,4].规定当所有整数都是负数时,最大字段和为0二)问题分析 :1、确定规划数组的意义:res[i]表示当以第i个数结尾时的最大字段和。(一定注意数组性质是以第i个数结尾的)2、状态转移方程:F=Max(res[i-1]+arr[i],arr[i])。...原创 2022-04-14 10:57:45 · 1267 阅读 · 0 评论 -
动态规划算法详解,Java实现相关例题。
前沿基础:一)基本理解:1、动态规划定义:将将原问题拆解为若干个子问题,同时保留子问题的答案,使得每个子问题只求解一次最终得到原问题的答案。 这样一听总感觉和分治算法很像,其实动态规划就是将分治递归算法转化成了非递归形式,减少了系统栈的调用,使用循环来解决问题。2、动态规划算法的说白了就是找到整个问题的全局最优解,这也是与贪心算法寻找局部最优解的本质区别。3、通常我们可以先用从顶向下的思考方式来写出递归分治的代码,然后再联想从低向下的思想来转化为动态规划代码.4、无论是递...原创 2022-03-31 11:48:51 · 4137 阅读 · 0 评论 -
选择排序。Java泛型设计选择排序。
前言基础:1、选择排序的时间复杂度为O(n2),空间复杂度为O(1)。2、选择排序是一个稳定的排序算法。3、每轮排序之后元素所在的位置就是其最终所在的位置。选择排序的逻辑非常简单,只是每次选择最小的元素放在第i个位置上,循环不变量如下图:public class SelectSort { public SelectSort(){} //arr[0,i]是有序的 public static <E extends Comparable&l.原创 2022-03-24 14:51:42 · 430 阅读 · 0 评论 -
堆排序。Java泛型实现推排序。
前言基础:1、堆排序的时间复杂度为O(nlogn),空间复杂度为O(1)。2、推排序是不稳定的排序算法。3、每次排序保证了后i个元素是有序的,第后i个元素所在的位置是其最后所在的位置,每次将区域内最大的元素放在倒数第i个位置上。4、堆排序大致分为整理堆和排序两个过程。下述代码都是索引从0开始的,所以:1、双亲节点:(i-1)/2。2、左孩子:2*i+1。3、右孩子:2*i+2.4、是否为叶子节点的条件 2 * i + 1 < n 或 2 * i + 2&l...原创 2022-03-23 20:35:15 · 1220 阅读 · 0 评论 -
二分查找法。Java泛型设计二分查找法。
前言基础:1、只能针对有序的数组进行查找。2、时间复杂度为O(logn)。3、使用前可以先排序,然后再查找,广泛应用于当一大组数据需要频繁查找,于是我们先将其进行排序,然后再通过二分查找进行查找。4、主要有两种实现方式:递归法和非递归法。5、如果有两个相同的元素,二分查找法返回的永远都是下标值小的那个索引。 例:Integer arr[]={0,1,2,3,3};找3,最终返回的是index=3而不是4.6、二分查找法的核心就是确定边界,看好函数目的确定if条件,w...原创 2022-03-22 18:31:50 · 1405 阅读 · 0 评论 -
希尔排序法。Java实现希尔排序
前言基础:1、因为希尔排序法的步长选取不是固定的,不同的步长会对应不同的复杂度,但是综合起来希尔排序法的时间复杂度是在O(nlogn)~O(n2)之间。空间复杂度为O(1)是一种不稳定的排序算法。2、希尔排序法最适合用于数据量不是特别大,而且数据近乎有序的数组。因为希尔排序法可以说是插入排序法的一个改进版。3、当数据量不是很大(近乎一百万以内时)希尔排序法的排序效率可能还会率高于时间复杂度为O(nlogn)的快排和归并排序法。排序原理由于插入排序的的在数组近乎有序的情况下性能最佳,而且原创 2022-03-17 21:56:28 · 657 阅读 · 0 评论 -
冒泡排序法。Java实现冒泡排序法
前言基础:1、冒泡排序法的时间复杂度为O(n2),空间复杂度为O(1),不需要额外的辅助空间。2、冒泡实质是不断两两比较,一旦两个相邻的元素是逆序的,就会交换这两个元素的位置,最终进行n-1次这样的操作。3、每轮循环结束之后过后,保证了arr[n-i,n]是有序的,并且保证了倒数第i个元素呆在了该元素应该呆在的位置。下论循环后面这i个元素不再进入比较交换。4、每次排序之后,就会将整个数组的杂乱度减小,即减小逆序对的个数。...原创 2022-03-17 12:06:52 · 1594 阅读 · 0 评论 -
快速排序,Java实现快速排序以及泛型设计快速排序
本文主要介绍了三版快速排序,第三版是最终版本,也是优化后性能最佳的版本。前言基础:1、快排的时间复杂度为O(nlogn)。2、之所以快是因为不断的划分,类似于归并排序法,但是归并是每次取一半,快排是不一定取一半,可能左边多右边少,也可能右边多左边少。3、对于未经过任何优化过的快速排序,数组越有序排序的效率越低,因为当数组完全有序会生成一个深度为元素个数的栈,很有可能超出系统栈的深度。可以通过随机数选取来优化这样的问题。4、快排是原地排序算法,不需要额外的辅助空间,空间复杂度为O(1).原创 2022-03-16 11:34:53 · 1180 阅读 · 0 评论 -
归并排序法。Java泛型设计归并排序法
如果大家不想看泛型设计的代码,直接点击下面目录中的普通设计即可跳转到非泛型设计的方法。目录一)归并排序法大致思想:二)时间与空间复杂度分析:三)排序流程四)代码实现一、泛型设计二、普通设计:一)归并排序法大致思想:可以将该算法分为两部分,一部分是划分,另一部分是归并。先用递归的方法将数据不断的递归细分,然后将最小细分单元(两个元素)变成有序,最后再结合归并方法将这些分别有序的数据进行合并。归并的过程必须是将两个有序的数组进行归并结合下图我们可...原创 2022-03-07 11:12:49 · 335 阅读 · 0 评论 -
插入排序法Java实现以及泛型设计
一)插入排序:基础:1、插入排序法的时间复杂度为O(n2),当数据较为有序时,插入排序的时间复杂度为O(n)。2、插入排序多用于对较为有序的数据进行排序(例:银行的业务订单,每个订单的时间基本相同,但是个别业务时间较长,所以会导致生成的订单时间靠后,所以当按照时间排序时,这组数据基本是有序的)3、插入排序保证了每次的前i个元素是有序的。4、与选择排序比:选择排序是每次排序之后元素所在的位置就是其最终的位置。插入排序不同,每次排序之后所在的位置是前i个元素中其应在的位置。排序动画:原创 2022-03-04 20:33:21 · 534 阅读 · 0 评论