算法描述:
從數組開頭開始向後遍歷,如果a[i]>a[i+1]則交換兩個,重復做,直到沒有交換的數對。
下面給出整數數組的兩種實現,一種是單方向的冒泡(即將大的數字向後交換),第二種是冒泡和下沉交替進行(即一次大數字向後移動,一次小數字向前移動),並比較兩個實現的運行時間:
第一種:
#include
#include
using namespace std;
const int Num=2000;
void exch(int* s,int a,int b)
{
int mid=s[a];
s[a]=s[b];
s[b]=mid;
}
int main()
{
int array[Num];
int flag=1;//記錄一趟最後交換的下標
int mod=0;
srand(3);//初始化隨機數
for(int i=0;iarray[j+1])
{
exch(array,j,j+1);
flag=j;
}
}
/*if(mod%2==0)
{
for(int j=0;jarray[j+1])
{
exch(array,j,j+1);
flag=j;
}
}
mod++;
}
else
{
for(int j=Num-1;j>0;j--)
{
if(array[j]
第二種:#include
#include
using namespace std;
const int Num=2000;
void exch(int* s,int a,int b)
{
int mid=s[a];
s[a]=s[b];
s[b]=mid;
}
int main()
{
int array[Num];
int flag=1;//記錄一趟最後交換的下標
int mod=0;
srand(3);//初始化隨機數
for(int i=0;iarray[j+1])
{
exch(array,j,j+1);
flag=j;
}
}*/
if(mod%2==0)
{
for(int j=0;jarray[j+1])
{
exch(array,j,j+1);
flag=j;
}
}
mod++;
}
else
{
for(int j=Num-1;j>0;j--)
{
if(array[j]
一般情況下交替進行冒泡排序要優於單方向的冒泡。對於長度為N的數組,最好情況下比較N-1次,交換0次;最壞情況下比較N(N-1)/2次,交換N(N-1)/2次。