冒泡排序的优化算法

/*
 *减少了冒泡排序外面的循环的次数,如果在第K项后没有产生交换,
 *则K项之后所有的项必定有序,如果k=0则说明整个数组都有序,则退出
 */
int* sort(int a[],int length)
{
     int k=length-1,j,kk,temp;  //k为最后一次调换的位置,kk为临时计数器
     while(k>0)
     {
          kk=0;
          for(j=0;j<k;j++)
         {
               if(a[j]>a[j+1])
              {
                   temp=a[j];
                   a[j]=a[j+1];
                   a[j+1]=temp;
                   kk=j;
              }
         }
         k=kk;
     }
     return a;
}

/*
*排序是在程序设计中常碰到的问题,排序算法也有很多种。起泡法是众所周知的排序算法,
*其原理是每次将相邻两个数进行比较,较大的下沉。其的主程序段如下(用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); 
}

/*
*分析上面的程序段我们可以发现正向起泡时第一次循环找出了最小数,反向起泡第一次循环找到最大数。
*很显然在一次循环中即可以找到一个最小的数还可以找到一个最大的数,
*所以用双向冒泡排序的交换的次数减少了,从而达到了优化起泡法的作用。 
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值