Discuz!NT
欢迎 游客 , 注册 | 登录 | 会员 | 界面 | 简洁版本 | 在线 | 帮助
商都网教育宝典宝库

发表新主题 回复该主题
本主题被查看927次, 共1个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第   上一主题   下一主题
标题: C++冒泡排序算法改进篇
-[尕硴]
超级版主
UID: 71
来自:
精华: 130
积分: 14003
帖子: 12909
注册: 2007-10-22 17:59:00
状态: 离线
威望: 444.00
金钱: 3355.00 元
只看楼主 2007-11-01 14:52
C++冒泡排序算法改进篇
排序是在程序设计中常碰到的问题,排序算法也有很多种。起泡法是众所周知的排序算法,其原理是每次将相邻两个数进行比较,较大的下沉。其的主程序段如下(用VC++实现): 

Void Bubble Sort (int* pData,int Count) 

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


  我们分析上述程序段可以发现起泡法是从一端开始比较的,第一次循环就是把最小数上升到第一位置,第二次循环就是把第二最小数上升到第二位置。如此循环实现数据的排序。那么我们是否可以找到最小数的同时找到最大数呢?当然可以。方法是在一端起泡时同时在另一端也进行起泡。即反向起泡。下面的程序段实现的是双向起泡: 

void Bubble2Sort(int* pData,int Count) 

  int iTemp; 
  int left = 1; 
  int right =Count -1; 
  int t; 
  do 
  { 
  //正向的部分 
  for(int i=right;i>=left;i--) 
  { 
  if(pData[i]<pData[i-1]) 
  { 
  iTemp = pData[i]; 
  pData[i] = pData[i-1]; 
  pData[i-1] = iTemp; 
  t = i; 
  } 
  } 
  left = t+1; 
  //反向的部分 
  for(i=left;i<right+1;i++) 
  { 
  if(pData[i]<pData[i-1]) 
  { 
  iTemp = pData[i]; 
  pData[i] = pData[i-1]; 
  pData[i-1] = iTemp; 
  t = i; 
  } 
  } 
  right = t-1; 
  }while(left<=right); 


  分析上面的程序段我们可以发现正向起泡时第一次循环找出了最小数,反向起泡第一次循环找到最大数。很显然在一次循环中即可以找到一个最小的数还可以找到一个最大的数,所以用双向冒泡排序的交换的次数减少了,从而达到了优化起泡法的作用
#1  
发表新主题 回复该主题
本主题被查看927次, 共1个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第







现在的时间是 2008-09-08 16:59:48

版权所有 商都网教育宝典
         Powered by Discuz!NT 1.0.6666    Copyright © 2001-2008 Comsenz Inc.
Processed in 0.064 seconds