![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
Astruries
知识就是力量
展开
-
最大子数组问题的两种解法
所谓最大子数组就是连续的若干数组元素,如果其和是最大的,那么这个子数组就称为该数组的最大子数组。最大子数组是很多问题的抽象,比如购买股票。如果把相邻两天的股价之差作为数组元素,那么求在连续的某个时间段内买入股票的最佳时间和卖出股票的最佳时间就可以抽象为计算最大子数组的问题。下面分别介绍两种算法求解最大子数组问题,算法思想均来自算法导论这本程序员的圣经。 分治法 分治法实现思路比较简单。如果把一...原创 2018-07-20 22:34:29 · 7933 阅读 · 1 评论 -
java实现双向链表
链表可以抽象为若干相连起来的节点,其迭代只能顺着节点链依次访问。节点的组成简单的分为三个属性:节点的存储的值、前驱节点、后继节点。 简单的单向链表的实现中有个头节点(head),迭代都是从head元素开始。链表head节点的前驱节点和链表尾部元素的后继节点都为null。向链表添加元素时,新加入的元素标记为head节点,然后改变之前的head元素的前驱节点为当前head节点即可。当删除链表某个节点...原创 2018-09-03 00:08:31 · 863 阅读 · 1 评论 -
基于分治的选择算法
原理 分治思想的强大又一次体现出来了。这种选择算法可以筛选出大小为n的序列中第i(i <= n)大的元素。特别的,也可以求中位数。find方法实现原理如同快速排序的划分阶段,唯一的区别是该方法为了找到目标元素递归调用自身。p>=r为基本情况。find方法遍历元素的过程中,array数组一直保持这样的三种状态直到遍历结束: [ array[j] < pivot的元素| arra...原创 2018-08-28 23:20:59 · 610 阅读 · 0 评论 -
计数排序
实现思路 计数排序的思想是这样的:使用a,b,c三个数组,a存储要排序的数,c作为临时存储用,b存储最后的排序结果。很显然,这种排序方式不同于基于比较的排序算法,也非原址的。笔者的实现使用了四个for循环,虽然循环次数较多,但总的来说算法时间复杂度是O(N),相比基于比较的排序算法时间复杂度的下界O(N(logN))要好。第一个循环将c数组内容全部置零,目的是为了给第二个循环中计数创造初始条件。...原创 2018-08-12 22:30:53 · 128 阅读 · 0 评论 -
java23种设计模式-命令模式
在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern)。 定义 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数...原创 2018-08-12 22:29:34 · 136 阅读 · 0 评论 -
快速排序的两种实现
快速排序是一种非常高效的基于比较的排序算法,其能在O(NlogN)的时间复杂度内完成排序。当然,这是期望运行时间,实际上也可能是O(N^2)。这取决与算法划分的是否平衡。快速排序算法的实现过程依赖于分治思想,按照分解、解决、合并的一般步骤看的话,快排实际上只用到了分解和解决两个步骤,因为快排是原址的,所以当合并的时候,排序的元素已经是有序状态了。 版本一 /** * desc : 快速排...原创 2018-08-05 23:31:32 · 313 阅读 · 0 评论 -
优先队列的实现
该优先队列的实现依赖于最大堆。关于最大堆,之前的博文:堆排序有讲。 heapMaximum返回堆中键最大的元素,即array[0]。 heapExtractMax方法删除并返回最大堆中最大键元素。 heapIncreaseKey的作用是将元素i的关键字值增加到key maxHeapInsert方法是将元素插入到最大堆中 /** * desc : 优先队列 * Created by ti...原创 2018-08-05 23:30:03 · 1536 阅读 · 0 评论 -
堆排序(java实现)
说到堆排序不得不说一下堆这种数据结构。这里的堆指二叉堆,本质是一个数组。可看作一个近似的完全二叉树(完全二叉树是所有叶子节点深度相同,且所有内部节点度为二的二叉树)。二叉堆有两种表现形式,最大堆和最小堆。最大堆中最大元素在二叉树的根结点,最小堆正好相反。我们的目的就是利用最大堆的特点,完成排序。 先上一段调试好的代码 package algorithms.portion6.heap; /*...原创 2018-07-26 23:30:44 · 116 阅读 · 0 评论 -
java两种实用的排序(插入排序、归并排序)
插入排序 插入排序是多种较为实用的排序方法之一。很多更高效的排序,当输入规模降低到一定程度就会切换到插入排序,因为在局部有序并且规模较小的情况下,插入排序非常高效。以下为代码实现。 /** * Created by tiantian on 2018/7/9. */ public class InsertSort { public static void sort(Int...原创 2018-07-15 23:54:56 · 2900 阅读 · 1 评论 -
java实现基于数组的栈和队列
栈和队列是非常基础但又十分重要十分常用的数据结构。栈的先入后出和队列的先入先入特性在软件工程中的应用非常广泛。以下为java版基于数组的简单实现。 /** * desc : 栈的数组实现 * Created by tiantian on 2018/9/1 */ public class Stack { private Object[] value; private i...原创 2018-09-03 00:10:03 · 1039 阅读 · 0 评论