您好、欢迎来到现金彩票网!
当前位置:迪士尼彩乐园 > 概率并行算法 >

用代码实现几种排序算法的时间复杂度比较

发布时间:2019-05-11 09:19 来源:未知 编辑:admin

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境

  下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么

  这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡:

  上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,

  显然,次数越多,性能就越差。从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1。

  若存在一常量K和起点n0,使当n=n0时,有f(n)=K*g(n),则f(n) = O(g(n))。(呵呵,不要说没学好数学呀,对于编程数学是非常重要的!!!)

  再看交换。从程序后面所跟的表可以看到,两种情况的循环相同,交换不同。其实交换本身同数据源的

  有序程度有极大的关系,当数据处于倒序的情况时,交换次数同循环一样(每次循环判断都会交换),

  复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。乱序时处于中间状态。正是由于这样的

  从运行的表格来看,交换几乎和冒泡一样糟。事实确实如此。循环次数和冒泡一样

  也是1/2*(n-1)*n,所以算法的复杂度仍然是O(n*n)。由于我们无法给出所有的情况,所以

  只能直接告诉大家他们在交换上面也是一样的糟糕(在某些情况下稍好,在某些情况下稍差)。

  现在我们终于可以看到一点希望:选择法,这种方法提高了一点性能(某些情况下)

  这种方法类似我们人为的排序习惯:从数据中选择最小的同第一个值交换,在从省下的部分中

  遗憾的是算法需要的循环次数依然是1/2*(n-1)*n。所以算法复杂度为O(n*n)。

  我们来看他的交换。由于每次外层循环只产生一次交换(只有一个最小值)。所以f(n)=n

  所以我们有f(n)=O(n)。所以,在数据较乱的时候,可以减少一定的交换次数。

  插入法较为复杂,它的基本工作原理是抽出牌,在前面的牌中寻找相应的位置插入,然后继续下一张

  上面结尾的行为分析事实上造成了一种假象,让我们认为这种算法是简单算法中最好的,其实不是,

  因为其循环次数虽然并不固定,我们仍可以使用O方法。从上面的结果可以看出,循环的次数f(n)=

  1/2*n*(n-1)=1/2*n*n。所以其复杂度仍为O(n*n)(这里说明一下,其实如果不是为了展示这些简单

  排序的不同,交换次数仍然可以这样推导)。现在看交换,从外观上看,交换次数是O(n)(推导类似

  选择法),但我们每次要进行与内层循环相同次数的‘=’操作。正常的一次交换我们需要三次‘=’

  高级排序算法中我们将只介绍这一种,同时也是目前我所知道(我看过的资料中)的最快的。

  它的工作看起来仍然象一个二叉树。首先我们选择一个中间值middle程序中我们使用数组中间值,然后

  把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使

  }while(i=j);//如果两边扫描的下标交错,就停止(完成一次)

  这里我没有给出行为的分析,因为这个很简单,我们直接来分析算法:首先我们考虑最理想的情况

  1.数组的大小是2的幂,这样分下去始终可以被2整除。假设为2的k次方,即k=log2(n)。

  其他的情况只会比这种情况差,最差的情况是每次选择到的middle都是最小值或最大值,那么他将变

  成交换法(由于使用了递归,情况更糟)。但是你认为这种情况发生的几率有多大??呵呵,你完全

http://attack11.net/gailvbingxingsuanfa/213.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有