双向冒泡算法比单向冒泡更适用于序列基本有序,但是有小元素在尾部,例如数列

1,2,3,4,5,6,7,8,9,0

如果使用单向冒泡算法,时间复杂度将是O(n^2)

改进的双向冒泡时间复杂度是O(n)

下面是双向冒泡算法的代码

/* 
* R[]存放待排序数据,从0开始存放,共n个记录
*/
#define bool _Bool
#define true 1
#define false 0

void Double_Bubble(int R[],int n)
{
int i,j;
int tmp;
bool exchange=true;
i=0;
while(exchange)
{
exchange=false;
for(j=i;j<n-i-1;j++)//向右扫描
{
if(R[j]>R[j+1])
{
exchange=true;
tmp=R[j];R[j]=R[j+1];R[j+1]=tmp;
}
}
for(j=n-i-1;j>i;j--)//向左扫描
{
if(R[j]<R[j-1])
{
exchange=true;
tmp=R[j];R[j]=R[j-1];R[j-1]=tmp;
}
}
i++;//每趟扫描结束都可以在两头确定一个元素的位置
}
}
/**************************************************************************
* Problem: 双向冒泡算法
* Copyright 2011 by Yan
* DATE:
* E-Mail: yming0221@gmail.com
***********************************************************************
*/

/*
* R[]存放待排序数据,从0开始存放,共n个记录
*/
#define bool _Bool
#define true 1
#define false 0

void Double_Bubble(int R[],int n)
{
int i,j;
int tmp;
bool exchange=true;
i=0;
while(exchange)
{
exchange=false;
for(j=i;j<n-i-1;j++)//向右扫描
{
if(R[j]>R[j+1])
{
exchange=true;
tmp=R[j];R[j]=R[j+1];R[j+1]=tmp;
}
}
for(j=n-i-1;j>i;j--)//向左扫描
{
if(R[j]<R[j-1])
{
exchange=true;
tmp=R[j];R[j]=R[j-1];R[j-1]=tmp;
}
}
i++;//每趟扫描结束都可以在两头确定一个元素的位置
}
}

该算法还能进一步改进,就是在数列的两端设置bound,用于记录最后一次交换的位置,这样可以进一步减少比较次数,进而减小时间复杂度。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-06
  • 2021-06-06
  • 2022-12-23
  • 2021-10-07
猜你喜欢
  • 2022-02-15
  • 2021-09-13
  • 2022-12-23
  • 2022-12-23
  • 2021-08-26
  • 2021-11-04
  • 2021-10-25
相关资源
相似解决方案