随笔分类 -  算法

摘要:接着上一Pa说。就是如何建立这个堆呢。可以从空的堆开始,然后依次往堆中插入每一个元素,直到所有数都被插入(转移到堆中为止)。因为插入第i个元素的所用的时间是O(log i),所以插入所有元素的整体时间复杂度是O(NlogN),代码如下。n=0;for(i=1;i=1;i--) siftd... 阅读全文
posted @ 2014-06-19 11:08 蚂蚁拉车 阅读(324) 评论(0) 推荐(0) 编辑
摘要:堆是什么?是一种特殊的完全二叉树,就像下面这棵树一样。 有没有发现这棵二叉树有一个特点,就是所有父结点都比子结点要小(注意:圆圈里面的数是值,圆圈上面的数是这个结点的编号,此规定仅适用于本节)。 符合这样特点的完全二叉树我们称为最小堆。反之,如果所有父结点都比子结点要大,这样的完全二叉树称为... 阅读全文
posted @ 2014-06-19 11:06 蚂蚁拉车 阅读(252) 评论(0) 推荐(0) 编辑
摘要:二叉树是一种特殊的树。二叉树的特点是每个结点最 多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树。更加严格的递归定义是:二叉树要么为空,要么由根结点、左子树和右子 树组成,而左子树和右子树分别是一棵二叉树。 下面这棵树就是一棵二叉树。 二叉树的使用范围最广,一棵多... 阅读全文
posted @ 2014-06-19 10:57 蚂蚁拉车 阅读(310) 评论(0) 推荐(0) 编辑
摘要:我们先来看一个例子。 这是什么?是一个图?不对,确切的说这是一棵树。这哪里像树呢?不要着急我们来变换一下。 是不是很像一棵倒挂的树,也就是说它是根朝上,而叶子朝下的。不像?哈哈,看完下面这幅图你就会觉得像啦。 你可能会问:树和图有什么区别?这个称之为树的东西貌似和无向图差不多嘛。不要着... 阅读全文
posted @ 2014-06-19 10:53 蚂蚁拉车 阅读(140) 评论(0) 推荐(0) 编辑
摘要:之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M。对于稀疏图来说,M要远远小于N2。先上数据,如下。4 51 4 94 3 81 2 52 4 61 3 7 第一行两个整数nm。n表示顶点个数(顶点编号... 阅读全文
posted @ 2014-06-17 17:13 蚂蚁拉车 阅读(243) 评论(0) 推荐(0) 编辑
摘要:上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”。本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径。 与Floyd-Warshall算法一样这里... 阅读全文
posted @ 2014-06-17 15:15 蚂蚁拉车 阅读(284) 评论(0) 推荐(0) 编辑
摘要:暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。 上图中有4个城市8条公路,公路上的数字表示这条公路的长短。请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就... 阅读全文
posted @ 2014-06-17 14:40 蚂蚁拉车 阅读(249) 评论(0) 推荐(0) 编辑
摘要:上一节中我们学习了队列,它是一种先进先出的数据结构。还有一种是后进先出的数据结构它叫做栈。栈限定只能在一端进行插入和删除操作。比如说有一个小桶, 小桶的直径只能放一个小球,我们现在向小桶内依次放入2号、1号、3号小球。假如你现在需要拿出2号小球,那就必须先将3号小球拿出,再拿出1号小球,最 后才... 阅读全文
posted @ 2014-06-17 13:44 蚂蚁拉车 阅读(297) 评论(0) 推荐(0) 编辑
摘要:新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问QQ号,小哈当然不会直接告诉小哼啦,原因嘛你懂的。所以小哈给了小哼一串加密 过的数字,同时小哈也告诉了小哼解密规则。规则是这样的:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数再放到这 串数... 阅读全文
posted @ 2014-06-17 13:43 蚂蚁拉车 阅读(403) 评论(0) 推荐(0) 编辑
摘要:之前讲了三种常用的经典排序。排序算法还有很多,例如选择排序、计数排序、基数排序、插入排序、归并排序和堆排序等等。堆排序是基于二叉树的排序,以后再说吧。来看一个具体的例子《小哼买书》来看看三个排序在应用上的区别和局限性。 小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读... 阅读全文
posted @ 2014-06-17 13:40 蚂蚁拉车 阅读(291) 评论(0) 推荐(0) 编辑
摘要:上一节的冒泡排序可以说是我们学习第一个真正的排序算法,并且解决了桶排序浪费空间的问题,但在算法的执行效率上却牺牲了很多,它的时间复杂度达到了O(N2)。假如我们的计算机每秒钟可以运行10亿次,那么对1亿个数进行排序,桶排序则只需要0.1秒,而冒泡排序则需要1千万秒,达到115天之久,是不是很吓人... 阅读全文
posted @ 2014-06-17 13:37 蚂蚁拉车 阅读(358) 评论(0) 推荐(0) 编辑
摘要:简化版的桶排序不仅仅有上一节所遗留的问题,更要命的是:它非常浪费空间!例如需要排序数的范围是0~2100000000之间,那你则需要申 请2100000001个变量,也就是说要写成int a[2100000001]。因为我们需要用2100000001个“桶”来存储0~2100000000之间每一... 阅读全文
posted @ 2014-06-17 13:33 蚂蚁拉车 阅读(316) 评论(0) 推荐(0) 编辑
摘要:在我们生活的这个世界中到处都是被排序过的。站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东西都需要排序,可以说排序是无处不在。现在我们举个具体的例子来介绍一下排序算法。 首先出场的我们的主人公小哼,上面这个可爱的娃就... 阅读全文
posted @ 2014-06-17 13:30 蚂蚁拉车 阅读(328) 评论(0) 推荐(0) 编辑
摘要:class Program { public float maxGongYueShu(int n1, int n2) { int temp = Math.Max(n1, n2);//求两个数的最大值 n2 = Math.Min(n1, n2);//求两个数中的最小值 n1 = temp;//记录临时值 while (n2 != 0) { n1 = n1 > n2 ? n1 : n2;//使n1中的数大于n2中的数 ... 阅读全文
posted @ 2014-02-20 09:50 蚂蚁拉车 阅读(218) 评论(0) 推荐(0) 编辑
摘要:插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:从第一个元素开始,该元素可以认为已经被排序取出下一个元素,在已经排序的元素序列中从后向前扫描如果该元素(已排序)大于新元素,将该元素移到下一位置重复步骤3,直到找到已排序的元素小... 阅读全文
posted @ 2014-02-11 15:21 蚂蚁拉车 阅读(221) 评论(0) 推荐(0) 编辑
摘要:鸡尾酒排序等于是冒泡排序的轻微变形。不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能,原因是冒泡排序只从一个方向进行比对(由低到高),每次循环只移动一个项目。 以序列(2,3,4,5,1)为例,鸡尾酒排序只需要访问一次序列就可以完成排序,但如果使用冒泡排序则需要四次。 但是在乱数序列的状态下,鸡尾酒排序与冒泡排序的效率都很差劲,优点只有观念简单这一点。鸡尾酒排序最糟或是平均所花费的次数都是,但如果序列在一开始已经大部分排序过的话,会接近。c#代码static int[] BubbleCocktailSort(int[]... 阅读全文
posted @ 2014-02-11 11:31 蚂蚁拉车 阅读(526) 评论(0) 推荐(0) 编辑
摘要:冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序对个项目需要O()的比较次数,且可以原地排序。尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。 冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要次交换,而插入排序只要最多... 阅读全文
posted @ 2014-02-11 10:48 蚂蚁拉车 阅读(316) 评论(0) 推荐(0) 编辑
摘要:排序算法是我们编程中遇到的最多的算法。目前主流的算法有8种。 平均时间复杂度从高到低依次是: 冒泡排序(o(n2)),选择排序(o(n2)),插入排序(o(n2)),堆排序(o(nlogn)), 归并排序(o(nlogn)),快速排序(o(nlogn)), 希尔排序(o(n1.25)),基数排序(o(n)) 这些平均时间复杂度是参照维基百科排序算法罗列的。 是计算的理论平均值,并不意味着你的代码实现能达到这样的程度。 例如希尔排序,时间复杂度是由选择的步长决定的。基数排序时间复杂度最小, 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。... 阅读全文
posted @ 2014-02-11 10:16 蚂蚁拉车 阅读(242) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示