算法和数据结构
文章平均质量分 50
Xurtle
俺的私人微博:http://weibo.com/hacker4long
展开
-
Java代码实现有序向量的二分查找
用这种算法的耗时将大大优于顺序查找,其所需要的时间复杂度为O(logn)代码的第一个版本如下:/** * @param e * 想要查找的元素 * @param arr * 目标数组 * @param lo * 起始元素的下标 * @param hi *原创 2015-09-09 09:55:40 · 717 阅读 · 0 评论 -
桶排序算法之Java实现
桶排序算法原理:将数组分到有限数量的桶子里。在将每个桶子里面的数据进行排序。Java代码实现此算法如下:public class BucketSort { public static void main(String[] args) { //随机产生10个介于0-1之间的保留2位小数点的小数 float[] a = new float[10];原创 2015-11-05 12:41:49 · 886 阅读 · 0 评论 -
基数排序算法之Java实现
基数排序的原理:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。Java代码实现此算法如下:/** * 基数排序 * * @param a * 待排序的数组 * @param d *原创 2015-11-04 21:22:36 · 842 阅读 · 0 评论 -
计数排序算法之Java实现
计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。当然,如果有多个元素具有相同的值时,我们不能将这些元素放在输出序列的同一个位置上,因此,上述方案还要作适当的修改。Java代码实现此算法如下:/**原创 2015-11-04 21:07:06 · 1291 阅读 · 0 评论 -
算法导论之2-3思考题
题目:霍纳规则的正确性: 写出伪代码以实现朴素多项式求值(native polynomial-evaluation)算法,它从头开 始计算多项式的每一个项。这个算法的运行时间是多少?与霍纳规则相比其性能如何?我用Java代码将其实现如下:首先,写出一个计算次方值的方法/** * 计算次方值 * @param a 底数 * @param b 指数原创 2015-10-24 19:15:37 · 1202 阅读 · 0 评论 -
算法导论之2.3-7练习题
题目:给出一个Θ(nlgn)时间的算法。判断在集合S中,是否存在两个元素的和为x。算法导论的教师手册解法如下:1.对集合S排序。 2.创建集合T = {z : z = x − y ,y ∈ S}。 3.对集合T排序。 4.去除S和T中的重复元素。 5.按照从小到大顺序或者从大到小顺序合并两个集合 6.对于合并以后的集合而言,当且仅当集合中的相邻位置出现相等元素,则存在,否则原创 2015-10-25 10:26:03 · 1116 阅读 · 0 评论 -
算法导论之2-4思考题
题目:设A[1..n]是一个包含n个不同数的数组。如果在i < j 的情况下,有 A[i]>A[j],则(i,j)就称为A中的一个逆序对(inversion)。c.插入排序的运行时间与各个元素的逆序对总和相等。d.给出一个算法,它能用Θ(nlgn)的最坏情况运行时间,确定 n 个元素的任何排列中逆序对的数目。为了验证程序的正确性,我顺便写了一个暴力求解的算法,Java代码如下:/** *原创 2015-10-26 11:08:14 · 897 阅读 · 0 评论 -
Java实现Strassen
Strassen算法也是一种基于分治思想的算法。首先我们用普通的分治方法来实现矩阵的乘法。这里我是用行下标和列下标来拆分矩阵的,并没有去复制矩阵中的元素,和算法导论中给出的思路是一样的。注意:以下的程序只适用N*N的矩阵。首先,我定义一个关于矩阵的对象,Java代码如下:package hanxl.insist.beans;/** * 矩阵类 * 之所以设置起始和结束下标是原创 2015-11-01 10:42:48 · 1248 阅读 · 0 评论 -
排序算法算法之Insertion Sort
插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。Java代码实现此算法如下:public static void insertionSort(int[] a) { for (int i = 1; i < a.length; i++) { int key = a[i];原创 2015-11-04 20:04:50 · 6378 阅读 · 0 评论 -
堆排序算法之Java实现
堆排序的基本思想是:利用数组的特点快速定位指定索引的元素,并将其构造成一个大顶堆,它可以被看作是一个完全二叉树。大顶堆的要求是每个节点的值都不大于其父节点的值。Java代码实现此算法如下:package hanxl.insist.seven;import java.util.Arrays;/** * 堆排序 * @author 韩兴隆 */public class HeapSort {原创 2015-11-05 20:29:28 · 973 阅读 · 0 评论 -
算法导论 8-2思考题 之线性时间原址排序
题目我就不把题目所有的内容全部写下来了,主要问题如下: n条记录,所有值都在1到k区间内,如何修改计数排序,使得它在O(n + k)的时间内完成对n条记录的原址排序。除输入数组外,你可以使用O(k)大小的额外存储空间。算法思想通过稍微修改一下计数排序,可以求得每个元素的开始下标。然后选择数组中的第一个元素和它正确位置上的元素交换,重复这一步,直到第一个元素就位。接着选择数组中的第二个元素重复这原创 2015-11-10 20:43:27 · 1946 阅读 · 2 评论 -
算法导论 8-3思考题 之变长数据项的排序
题目 给定一个整数数组,其中不同的整数所包含的数字的位数可能不同,但该数组中,所有整数中包含的总数字为n。设计一个算法,使其可以在O(n)时间内对该数组进行排序。算法思路首先,我们可以用计数排序按数字的位数进行排序。然后,用基数排序来对每组数位相同的数字进行排序。每个数字的数位在1到n之间,令i为数字的位数,mim_i为位数为i的数字的个数。由于一共n位数,So,我们有如下公式:∑i=1ni∗原创 2015-11-11 21:14:20 · 1898 阅读 · 3 评论 -
leetcode之Maximum Subarray
题目如下图所示:链接地址:https://leetcode.com/problems/maximum-subarray/暴力方法如下:public static MaximumSubarrayInfo violence_maximumSubarray( int[] arr ) { MaximumSubarrayInfo maximumSubarrayInfo原创 2015-10-30 16:59:22 · 744 阅读 · 0 评论 -
排序算法算法之Bubble Sort
在接下来的一段时间里,我准备整理一下自己的博客。尽自己最大努力把几年前写过的文章都看一遍,把一些存在错误的文章修改一下、把没有必要修改的文章删掉以及把一些知识点不全的文章进行完善。之所以整理自己的博客有以下3点原因原创 2016-10-25 10:15:18 · 4965 阅读 · 0 评论 -
常用的数据结构操作与排序算法的时间和空间复杂度
大家好!这篇文章包含了计算机科学中常用算法的时间和空间复杂度。过去准备技术面试的时候,我通常需要花费很多时间去网上搜索这些算法的最好、平均和最坏情况的复杂度,然后把它们归纳总结在一起,使得我在面试问到的时候不会被难住。在过去的几年里,我面试了一些硅谷的创业公司,也有一些像Google, Facebook, Yahoo, LinkedIn, 和 eBay这样的大公司,当我每一次准备面试时,我自己就翻译 2017-01-21 18:43:34 · 892 阅读 · 0 评论 -
排序算法汇总
引言排序是算法研究中最基础的问题,如何快速得完成所给元素的排序是很重要的。下面我将归纳出一些常用的排序算法,并将其分别用Java语言实现。归纳表格如下 排序算法 最坏情况运行时间 期望运行时间 辅助存储空间 稳定性 插入排序 Θ(n^2) Θ(n^2) O(1) 稳定 归并排序 Θ(nlogn) Θ(nlogn) O(n) 稳定 堆排序原创 2015-11-05 20:39:28 · 731 阅读 · 0 评论 -
快速排序(Quicksort)详解
引言这篇文章是我在2015年写的,当时正在看算法导论中关于快排的部分,因此写下文章总结一下当时对快排的理解。这几天我一直在review一下我先前写的blog,发现有些地方写的不算太好,还有一些错误的地方。今天我重新修改一下这篇文章,把错误的地方修正过来,并补充一些新的内容。初识QuicksortQuicksort是一个分而治之的算法,它根据主元把一个大数组分成2个小数组:其中1个数原创 2015-11-05 11:59:29 · 28071 阅读 · 1 评论 -
并查集(Disjoint-set)详解(附图片例子)
并查集基本思路学习任何一个数据结构之前,都应该先定义其有哪些操作。并查集也是一种数据结构,因此,俺准备定义一下它有哪些操作。(P.S. 俺假设看这篇文章的童鞋至少高中毕业,都知道数学中的集合是个什么概念,嘿嘿)1、初始化(initialize)操作:把集合中的每个元素看作是一个子集合2、合并(Union)操作:把2个子集合,合并成一个集合3、查找(Find)操作:判断2个元素是否在...原创 2014-11-02 19:32:45 · 1369 阅读 · 0 评论 -
分治法 ( Divide And Conquer ) 详解
在这篇 blog 中,我首先会介绍一下分治法的范式,接着给出它的递归式通式,最后我会介绍三种方法(代入法,递归树,和主方法)求解递归式原创 2018-01-29 22:06:39 · 41038 阅读 · 2 评论 -
Java实现二叉搜索树
前言在做算法导论第12章的习题时,有一些习题需要用到二叉搜索树的数据结构,为了方便,我将其用Java实现了这个数据结构。Talk is cheap,show me the code.我就闲话少说了,代码如下。Java代码实现二叉搜索树数据结构package hanxl.insist.twelvechapter;import java.util.Stack;/** * 搜索二叉树 * @autho原创 2015-11-23 17:20:34 · 579 阅读 · 0 评论 -
归并排序算法之Java实现
归并排序的基本思想完全遵循分治模式:分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。解决:使用归并排序递归的排序两个子序列。合并:合并两个已排序的子序列以产生已排序的答案。Java代码实现此算法如下:public static void mergeSort(int[] arr, int lo, int hi) { if ( lo < hi - 1 ) {原创 2015-11-04 20:21:13 · 743 阅读 · 0 评论