算法第四版
forTHQ
这个作者很懒,什么都没留下…
展开
-
算法1.1 下压栈(LIFO)能动态调整数组的大小
算法1.1 下压栈(LIFO)能动态调整数组的大小代码实现如下:public class ResizingArrayStack<Item> implements Iterable<Item>{ private Item[] a = (Item[]) new Object[1];//栈元素 private int N = 0;//元素数量 public boolean isEmp原创 2016-05-23 23:52:04 · 657 阅读 · 0 评论 -
优先队列
优先队列下面这个优先队列是由一个基于堆的完全二叉树实现的,其插入和删除最大元素方法都能在对数时间内完成。二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级存储(不使用第0个元素)。二叉树有以下两个重要的特性: 1.一颗大小为N的完全二叉树的高度是lgN向下取整 2.k节点的父节点为k/2,两个子节点分别为2k和2k+1使用上面两个特性实现了sink和swim方法public c原创 2016-06-05 23:20:11 · 312 阅读 · 0 评论 -
快速排序
快速排序实现原理:递归的将切分元素的左边和右边排序,优点是原地排序,而且速度快,时间复杂度是线性对数的import edu.princeton.cs.algs4.StdOut;import edu.princeton.cs.algs4.StdRandom;public class Quick { public static void sort(Comparable[] a){原创 2016-06-05 22:42:35 · 323 阅读 · 0 评论 -
Dijkstra的双栈算数表达式求值算法
Dijkstra的双栈算数表达式求值算法说明:这个算法的输入要求是必须补全所有括号,否则算法会出错,数字和符号之间应该留有一个空格。import edu.princeton.cs.algs4.Stack;import edu.princeton.cs.algs4.StdIn;import edu.princeton.cs.algs4.StdOut;public class Evaluate {原创 2016-05-22 23:24:24 · 595 阅读 · 0 评论 -
典型的数组和字符串处理代码
表1.1.4典型数组处理代码注:仅实现了关键代码,数组以double型数组为例找出数组中的最大值double max = a[0];for(int i = 1;i<a.length;i++) if(max < a[i]) max = a[i];2.计算数组的平均值double sum = 0;int N = a.length;for(int i = 0;i <N;i原创 2016-05-19 14:08:26 · 435 阅读 · 0 评论 -
归并排序
这里一共实现了两个版本的归并排序,一个自顶而下,一个自底而上归并排序(自顶而下)实现原理:将两个已经排序好的数组合并成一个数组也是有序的。优点:能保证将任意长度为N的数组排序所需要的时间和NlogN成正比缺点:所需的额外空间和N成正比实现代码如下:import edu.princeton.cs.algs4.StdOut;public class Merge { private static原创 2016-06-03 14:09:29 · 314 阅读 · 0 评论 -
希尔排序
希尔排序希尔排序更高效的原因是它权衡了子数组的规模和有序性实现原理:使数组中任意间隔为h的元素都是有序的,这样的数组被称为h有序数组。如果h很大就可以一次把元素移动到很远的地方, 而不需要像插入排序一样一次只能移动一个位置。对于任意以1为结尾的h序列,都能这样将数组排序性能特点:现在仍不能准确描述对于乱序的数组的性能特征,可以肯定的是它的运行时间不到平方级别优点:代码量很小,不需要额外的内存空间,速原创 2016-06-03 13:43:37 · 391 阅读 · 0 评论 -
选择排序和插入排序
选择排序选择排序的设计思路是每次内层循环找出最小值放在上次最小值的后面来实现排序算法复杂度:O(N*N)它的两个鲜明的特点: 1.运行时间和输入没有关系 2.数据移动式最少的,每次交换只改变两个元素的值,交换次数和数组大小是线性关系代码实现如下:import edu.princeton.cs.algs4.StdOut;public class Selection { public st原创 2016-06-03 13:31:13 · 662 阅读 · 0 评论 -
算法四 第一章第一节基础习题
算法四第一章基础习题我只给出了代码类的习题 1.1.3 编写一个程序,从命令行得到三个整数参数。如果它们都相等则打印 equal,否则打印 not equal。 package chapter1;import edu.princeton.cs.algs4.StdIn;//这是算法第四版这本书里面的类库import edu.princeton.cs.algs4.StdOut;public cla原创 2016-05-20 15:34:29 · 2764 阅读 · 6 评论 -
第一章 答疑摘选
在第一章后面,作者列出了一些问题并给出了回答,我将其中的一些我不熟悉的问题。1.问 如何才能将一个 double 变量初始化为无穷大? 答 可以使用 Java 的内置常数:Double.POSITIVE_INFINITY 和 Double.NEGATIVE_INFINITY。 2. 问 Java 表达式 1/0 和 1.0/0.0 的值是什么? 答 第一个表达式会产生一个运行时除零异常原创 2016-05-19 23:21:03 · 272 阅读 · 0 评论 -
计算两个非负整数的最大公约数
算法第四版代码现在开始学习算法,准备把书上的代码实现一遍,算是对自己学习的一个检验,希望自己可以坚持下去。计算两个非负整数 p 和 q 的最大公约数:若 q 是 0,则最大公约数为 p。否则,将 p 除以 q 得到余数 r,p 和 q 的最大公约数即为 q 和 r 的最大公约数。public static int gcd(int p, int q){ if(q == 0) r原创 2016-05-19 13:05:42 · 2390 阅读 · 0 评论 -
动态连通性问题
动态连通性问题算法实现及优化首先定义算法的API 方法 作用 UF(int N) 初始化触点及其他数据 int find(int p) 返回p所在连通分量的标识符 int union(int p,int q) 在p和q之间添加一条线 int count () 返回连通分量的数量 boolean connected(int p,int q) 如果p和q之间原创 2016-05-30 13:37:00 · 589 阅读 · 0 评论 -
第一个算法优化例子
统计数组中不相同的两个数和为零的个数时间复杂度为线性对数import java.util.Arrays;public class TwoSumFast { public static int count(int[] a){ Arrays.sort(a); int N = a.length; int cnt = 0; for(i原创 2016-05-25 21:58:34 · 610 阅读 · 0 评论 -
栈和队列(使用链表实现)
1.栈import java.util.Iterator;public class Stack<Item> implements Iterable<Item>{ private int N; private Node first; private class Node { Node next; Item item; }原创 2016-05-25 11:16:14 · 573 阅读 · 0 评论 -
堆排序
堆排序堆排序是在二叉堆的基础上进行的排序,其时间复杂度为线性对数,而且不需要额外的空间,是原址排序。import edu.princeton.cs.algs4.StdOut;public class HeapSort { public static void sort(Comparable[] a){ int N = a.length; for(int k原创 2016-06-05 23:24:42 · 369 阅读 · 0 评论