代码改变世界

随笔分类 - 数据结构与算法

【思维】中位数与顺序统计

2011-04-28 00:08 by BlueDream, 1226 阅读, 收藏, 编辑
摘要:算法定义在统计学中,中值(又称中位数)代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中值。如果观察值有偶数个,则中值不唯一,通常取最中间的两个数值的平均数作为中值。一个数集中最多有一半的数值小于中值,也最多有一半的数值大于中值。如果大于和小于中值的数值个数均少于一半,那麽数集中必有若干值等同于中值。设连续随机变量X的分布函数为F(X),那么满足条件P(X≤m)=F(m)=1/2的数称为X或分布F的中位数。对于一组有限个数的数据来说,它们的中位数是这样的一种数:这群数据里的一半的数据比它大,而另外 阅读全文

【思维】基数排序

2011-04-17 23:35 by BlueDream, 1378 阅读, 收藏, 编辑
摘要:算法定义基数排序(Radix sort)是一种排序算法,它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列.基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。算法描述基数排序的简单描述就是将数字拆分为个位十位百位,每个位依次排序。因为这对算法稳定要求高。所以我们对数位排序用到上一个排序方 阅读全文

【思维】计数排序

2011-04-14 23:10 by BlueDream, 1109 阅读, 收藏, 编辑
摘要:算法定义计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n+k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。但是,计数排序可以用在基 阅读全文

【思维】快速排序

2011-04-14 00:34 by BlueDream, 1012 阅读, 收藏, 编辑
摘要:算法定义快速排序是一种排序算法,由C. A. R. Hoare所发展的,以平均效能来说,排序n个项目要Θ(nlogn)次比较。然而,在最坏的效能下,它需要Θ(n2)次比较。一般来说,快速排序实际上明显地比其他Θ(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。算法描述快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。步骤为: 从数列中挑出一个元素,称为 "基准"(pi 阅读全文

【思维】堆排序

2011-04-13 01:35 by BlueDream, 965 阅读, 收藏, 编辑
摘要:算法定义堆排序(Heapsort)是指利用(堆)这种数据结构所设计的一种排序算法。堆积树是一个近似完全二叉树的结构,并同时满足堆属性:即子结点的键值或索引总是小于(或者大于)它的父节点。 最差时间复杂度 O(nlogn) 最优时间复杂度 O(nlogn) 平均时间复杂度 Θ(nlogn) 算法描述在堆积树的数据结构中,堆积树中的最大值总是位于根节点。堆积树中定义以下几种操作: 最大堆积调整(Max_Heapify):将堆积树的末端子结点作调整,使得子结点永远小于父结点 创建最大堆积(Build_Max_Heap):将堆积树所有数据重新排序 堆积排序(HeapSort):移除位在第一个数据的根结 阅读全文

【思维】插入排序

2011-04-09 12:23 by BlueDream, 933 阅读, 收藏, 编辑
摘要:算法定义插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。算法描述一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:从第一个元素开始,该元素可以认为已经被排序取出下一个元素,在已经排序的元素序列中从后向前扫描如果该元素(已排序)大于新元素,将该元素移到下一位置重复步骤3,直到找到已排序 阅读全文

【思维】归并排序

2010-03-17 16:53 by BlueDream, 325 阅读, 收藏, 编辑
摘要:归并排序:是一个在效率上高于一般排序的算法.一般排序:冒泡, 插入, 选择排序的时间复杂度为O(N^2), 而归并排序的时间复杂度为O(N*LOG N).如果N(及排序项的数目)是10000.那么N^2就是100000000, 而N * LOG N则是40000. 也就是如果这个数量的数据.如果用归并排序需要40S的时间,那么用插入排序则需要28个小时.归并排序算法的核心:核心思想就是分治算法.先进行划分,再进行排序归并.归并两个有序的数组.即归并两个有序的数组A和B,然后就有了包含这两个新数组的数组C.即一次拿出A和B的数组项进行比较.小的就插入到新容器C中.直到一方已经插入完毕.如果另一方 阅读全文

【思维】javascript选择排序

2010-01-18 09:39 by BlueDream, 467 阅读, 收藏, 编辑
摘要:上篇写了冒泡排序.冒泡排序算法复杂度为O(n^2).本篇在冒泡排序的基础上进行了一点精进.那就是选择排序.选择排序与冒泡排序的区别就是:不需要像冒泡排序那样每次都交换元素.选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的元素,则将那个更小的元素的下标赋给临时变量,最... 阅读全文

【思维】javascript冒泡排序

2010-01-14 11:28 by BlueDream, 435 阅读, 收藏, 编辑
摘要:学这些的目的就是为了锻炼逻辑思维.也许像冒泡排序这种低效的排序.很少能使用得到. 但高级算法也都是在这些简单算法的积累上产生的.下面就介绍下冒泡排序的原理:冒泡排序算法的运作如下比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个(体现在程序中.就是用外层循... 阅读全文

链表结构之有序链表

2009-09-03 16:57 by BlueDream, 1881 阅读, 收藏, 编辑
摘要:有序链表:存储有序数据的链表结构为有序链表.有了以前链表的基础.写起来就很简单了.无非是从first循环链结点,一直找到一个大于当前链结点关键字的那个链结点.将追加的这个链结点插到前面即可.需要注意的就是插入在头部和尾部的特殊处理.下面写了个用有序链表做排序: [代码]运行结果为: [代码]有序链表的效率:有序链表插入数据效率为O(N),但查找跟删除最大数据就是表头数据效率为O(1).所以在最小数... 阅读全文

链表结构之ADT(栈与队列模拟)

2009-09-03 00:13 by BlueDream, 677 阅读, 收藏, 编辑
摘要:ADT(抽象数据类型):泛泛的说,就是将类(数据类型)进行高度抽象.着重于他做了什么而忽略了他是怎么做的.即下面两类用链表分别模拟栈(Stack)和队列(Queue).栈: FILO先进后出.拥有push(入栈)和pop(出栈)队列: FIFO先进先出.拥有insert(入列)和remove(出列).ADT即是将链表方法进行封装.让使用者只关心本身方法使用,而不关心具体的实现方式.模拟的代码分别如... 阅读全文

链表结构之双端链表

2009-09-02 12:52 by BlueDream, 4366 阅读, 收藏, 编辑
摘要:双端链表:双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用如上图所示:由于有着对最后一个链结点的直接引用.所以双端链表比传统链表在某些方面要方便.比如在尾部插入一个链结点.双端链表可以进行直接操作但传统链表只能通过next节点循环找到最后链结点操作.所以双端链表适合制造队列.下面的双端链表类.有几个重要方法.insertFirst(插入首链结点)这个方法与上篇博文的单链表是... 阅读全文

链表结构之单链表

2009-09-01 14:36 by BlueDream, 3526 阅读, 收藏, 编辑
摘要:链表:一种数据存储结构.学链表首先要搞懂数组,按朋友的话说,数组和链表的关系就相当于QQ2008和QQ2009.除非要通过索引频繁访问各个数据,不然大多数情况下都可以用链表代替数组.链表部分主要要涉及:单链表,双端链表,有序链表,双向链表和有迭代器的链表(迭代器是用来随机访问链表元素的一种方法).由于以前贪玩数据结构没上课,现在后悔所以要努力补上.链结点:在链表中,每个数据项都被包含在"链结点"(... 阅读全文

java选择排序和二分查找

2009-08-23 12:44 by BlueDream, 908 阅读, 收藏, 编辑
摘要:[代码] 阅读全文