C++常用排序法研究

发表于:2010-11-17 10:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

分享:

  倒序(最糟情况)

  第一轮:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)

  第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次)

  第一轮:7,8,10,9->7,8,9,10(交换1次)

  循环次数:6次

  交换次数:6次

  其他:

  第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次)

  第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次)

  第一轮:7,8,10,9->7,8,9,10(交换1次)

  循环次数:6次

  交换次数:3次

  上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,显然,次数越多,性能就越差。从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1。

  写成公式就是1/2*(n-1)*n。

  现在注意,我们给出O方法的定义:

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

  现在我们来看1/2*(n-1)*n,当K=1/2,n0=1,g(n)=n*n时,1/2*(n-1)*n<=1/2*n*n=K*g(n)。所以f(n)=O(g(n))=O(n*n)。所以我们程序循环的复杂度为O(n*n)。

  再看交换。从程序后面所跟的表可以看到,两种情况的循环相同,交换不同。其实交换本身同数据源的有序程度有极大的关系,当数据处于倒序的情况时,交换次数同循环一样(每次循环判断都会交换),复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。乱序时处于中间状态。正是由于这样的原因,我们通常都是通过循环次数来对比算法。

  2.交换法:

  交换法的程序最清晰简单,每次用当前的元素一一的同其后的元素比较并交换。

#include <iostream.h> 
void ExchangeSort(int* pData,int Count) 

  int iTemp; 
  for(int i=0;i<Count-1;i++) 
  { 
    for(int j=i+1;j<Count;j++) 
    { 
      if(pData[j]<pData[i])  [Page]
      { 
        iTemp = pData[i]; 
        pData[i] = pData[j]; 
        pData[j] = iTemp; 
      } 
    } 
  } 

void main() 

  int data[] = {10,9,8,7,6,5,4}; 
  ExchangeSort(data,7); 
  for (int i=0;i<7;i++) 
    cout<<data[i]<<\" \"; 
  cout<<\"\\n\"; 

62/6<123456>
精选软件测试好文,快来阅读吧~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号