C++常用排序法研究

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

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

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

分享:

  倒序(最糟情况)

  第一轮:10,9,8,7->9,10,8,7(交换1次)(循环1次)  [Page]

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

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

  循环次数:6次

  交换次数:3次

  其他:

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

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

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

  循环次数:4次

  交换次数:2次

  上面结尾的行为分析事实上造成了一种假象,让我们认为这种算法是简单算法中最好的,其实不是,因为其循环次数虽然并不固定,我们仍可以使用O方法。从上面的结果可以看出,循环的次数f(n)<=1/2*n*(n-1)<=1/2*n*n。所以其复杂度仍为O(n*n)(这里说明一下,其实如果不是为了展示这些简单排序的不同,交换次数仍然可以这样推导)。现在看交换,从外观上看,交换次数是O(n)(推导类似选择法),但我们每次要进行与内层循环相同次数的‘=’操作。正常的一次交换我们需要三次‘=’,而这里显然多了一些,所以我们浪费了时间。最终,我个人认为,在简单排序算法中,选择法是最好的。

  二、高级排序算法:

  高级排序算法中我们将只介绍这一种,同时也是目前我所知道(我看过的资料中)的最快的。它的工作看起来仍然象一个二叉树。首先我们选择一个中间值middle程序中我们使用数组中间值,然后把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使用这个过程(最容易的方法——递归)。

  1.快速排序:

#include <iostream.h> 
void run(int* pData,int left,int right) 

  int i,j; 
  int middle,iTemp; 
  i = left; 
  j = right; 
  middle = pData[(left+right)/2]; //求中间值 
  do{ 
    while((pData[i]<middle) && (i<right))//从左扫描大于中值的数 
      i++;      
    while((pData[j]>middle) && (j>left))//从右扫描大于中值的数 
      j--; 
    if(i<=j)//找到了一对值 
    { 
      //交换 
      iTemp = pData[i]; 
      pData[i] = pData[j]; 
      pData[j] = iTemp; 
      i++; 
      j--; 
    }  [Page]
  }while(i<=j);//如果两边扫描的下标交错,就停止(完成一次) 
  //当左边部分有值(left<j),递归左半边 
  if(left<j) 
    run(pData,left,j); 
  //当右边部分有值(right>i),递归右半边 
  if(right>i) 
    run(pData,i,right); 

void QuickSort(int* pData,int Count) 

  run(pData,0,Count-1); 

void main() 

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

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号