![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java算法与抽象
守护砂之国泰裤辣
既然已经走这么远了,那么不妨再走远一点...
展开
-
Java实现简单的链表(钢铎的烽火)
因为Java里的对象名本身是一个引用类型,类似于C里面的指针,所以可以很简单地拿来指向下一个节点。 我们以钢铎的烽火为例,从尾巴插入节点,从头依次点燃烽火!参考《Java程序设计 基础、编程抽象与算法策略》 /* * File: BeaconsOfGondor.java * -------------------------- * This program illustrates the原创 2018-02-05 17:36:36 · 258 阅读 · 0 评论 -
Java实现简单的栈
栈是线性结构中一种重要的,以“后进先出”的方式存放数据的数据结构。 现实现一个简单的整型栈类,参考于《Introduction to Java Progrmming 10th》 chapter10 一个栈类的UML图如下: 实例域: elements: int[] 一个存储栈中的整数的数组size: int ...原创 2018-03-25 12:27:13 · 1155 阅读 · 0 评论 -
排序算法_选择排序
之前我们讨论过冒泡排序,这次我们来接触一下选择排序。选择排序就是要(假如我们是升序排序)每次选择出剩下序列中最小的元素放到当前序列的首位置。前面我们学的冒泡排序,那个是两个邻居元素相互比较,把最大的元素依次‘推’到序列的末端;而选择排序就是通过“打擂”的思想找出最小或最大的元素后,将其与序列首部或尾部交换来达成排序的目的的。wikipeda上的动态图:假如我们要排序的序列为:我们要从当前序列中找到...原创 2018-02-12 23:10:27 · 192 阅读 · 0 评论 -
排序算法_冒泡排序
我们将讨论一系列排序算法。第一个算法是冒泡排序。冒泡,顾名思义就是将轻的气体从水中浮出,反过来就是沉底。而冒泡排序的思想就是每次从当前序列中两两元素比较并且必要时交互两个元素的位置来实现将当前序列中最大或最小的元素“浮”到序列末端。wikipeda上的gif图:假如我们要排序的整数序列为:一开始我们比较该序列的前两个元素,假如我们是按升序排列:我们发现56>25,我们就交互这两个元素:交换完...原创 2018-02-12 21:26:31 · 339 阅读 · 0 评论 -
排序算法_归并排序
归并排序算是分而制之策略里的典型算法之一。 先来看看wikipeda上的gif图: 它的提出,是为了改进前面冒泡和选择排序存在的问题,对于后两种排序,随着问题规模的翻倍,其运行时间会增长到4倍。如果我们反过来思考,将问题的规模减小一半,那么运行时间就是原来的四分之一。有了这个事实,将数组拆散再按序合并的这种应用递归的分而治之的归并排序就有了理论依据。 考虑到下列一组序列:...原创 2018-02-22 10:33:23 · 357 阅读 · 0 评论 -
排序算法_快速排序
尽管有前面复杂度较好的归并排序,但当今大多数排序程序都是基于快速排序算法。它是英国计算机科学家C.A.R.(Tony) Hoare发明的。 wikipeda上的gif图描述快排: 和前面归并排序一样,快速排序也采用了分而治之的策略,不过它在拆的时候就让序列“稍微有序”,越拆越有序,最后就不用像归并一样重建数组了。 如何做到稍微有序呢?就是让偏大的元素尽量靠近序列末尾,较小的...原创 2018-02-22 12:03:49 · 309 阅读 · 0 评论 -
排序算法_桶排序
这是一个特别有趣的排序算法,它的排序复杂度是居然是线性的,可以达到O(n)。当然,它需要额外的数组,也就是一排“桶”来计数,桶的数量与最大元素有关。还有一个缺点,它适用场景比较局限。 我们举个栗子,假如大学里一个计算机专业班的数据结构成绩(满分100分,最低0分)出来了,想到这个莫名感伤,假如这个班有6个人(先假设一下,几百个人也是同样的处理方法),它们的成绩是30,93, 71, ...原创 2018-02-22 09:50:17 · 192 阅读 · 0 评论 -
Java递归——生成排列问题
排列问题描述:如输入字符串“ABC”,调用递归函数将生成一个排列集合:{"ABC", "ACB", "BAC", "BCA", "CAB", "CBA"}也就是3!=6个非空子集。而对于字符串“AABB”,那么只会产生6种排列:{"AABB", "ABAB", "ABBA", "BAAB", "BAB原创 2018-02-08 17:56:21 · 430 阅读 · 0 评论 -
Java递归解决子集求和问题
子集求和问题属于难以高效解决的计算问题中的一类,用于以信息保密为目标的应用中。子集求和问题的定义为:给定一个整数集和目标值,确定是否可以找到这些整数的一个子集,使其总和等于指定的目标值。比如给定集合{-2,1,3,8}和目标值7,那么问题的答案就是是,因为有子集{-2,1,8}加起来对于7。但是如果目标值是5,答案就为否。所以我们很容易定义出递归函数原型:boolean subsetSumExis...原创 2018-02-08 11:52:16 · 2555 阅读 · 0 评论 -
分而治之求x的n次方
我们可以很容易地编写出下面的递归方法:double raiseToPower(double x, int n)用它来计算x^n,基于递推式: x^n = x * x^(n - 1)这种策略会导致该实现在线性时间内运行。如果我们基于以下式子: x^(2 * n)...原创 2018-02-13 17:37:34 · 397 阅读 · 0 评论 -
排序算法_插入排序
我们斗地主或者打麻将的时候,每轮开始时会起牌(也叫抓牌)。然后将抓到的牌插入到手中的牌中使其有序。这个插入的过程就和插入排序很类似。这篇博客就简单介绍一下插入排序。给定一组序列,我们要将其升序排序,如:1.假设我们第一次抓牌时,0号位置,抓到56,那么它就是有序的。2.我们从第二次抓牌开始,来到1号位置,抓到25,它小于56,所以我们要将其插入到56前面。3.第三次抓牌,来到2号位置,“牌面值”为...原创 2018-02-13 17:21:49 · 140 阅读 · 0 评论 -
动态规划案例——Nim游戏
游戏开始有一堆硬币,共13枚。在每一轮,每个玩家要从这堆硬币中拿走1、2或3枚,将它们放到一边。游戏的目标是避免拿到最后一枚硬币。人机对弈程序,机器后拿。祝你好运import java.util.Scanner; public class Nim { public void run() { printInstructions(); nCoins = STARTING_COIN...原创 2018-02-12 23:50:57 · 557 阅读 · 0 评论 -
二分查找 迭代方法与递归方法——java实现
相比较于线性查找,二分查找算法是查找数组中元素的高效方法,它生成一棵二分查找树,复杂度为O(log2n)。当然前提是数组有序。import java.util.Scanner; public class BinarySearch { public static int binarySearch(int[] arr, int purpose) { int bottom = 0; ...原创 2018-06-03 14:02:54 · 520 阅读 · 0 评论