摘 要:本文對排序中最常見的起泡法進行分析,發現在實現單向起泡的同時可以實現雙向起泡,從而實現了冒泡算法的改進,提高了運算速度。
關鍵字:程序設計、起泡、雙向起泡、VC++
排序是在程序設計中常碰到的問題,排序算法也有很多種。起泡法是眾所周知的排序算法,其原理是每次將相鄰兩個數進行比較,較大的下沉。其的主程序段如下(用VC++實現):
Void Bubble Sort (int* pData,int Count)
{
Int iTemp;
for(int i=1;i {
For (int j=Count-1;j>=i;j--)
{
if(pData[j] {
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] {
iTemp = pData[i];
pData[i] = pData[i-1];
pData[i-1] = iTemp;
t = i;
}
}
left = t+1;
//反向的部分
for(i=left;i {
if(pData[i] {
iTemp = pData[i];
pData[i] = pData[i-1];
pData[i-1] = iTemp;
t = i;
}
}
right = t-1;
}while(left<=right);
}
分析上面的程序段我們可以發現正向起泡時第一次循環找出了最小數,反向起泡第一次循環找到最大數。很顯然在一次循環中即可以找到一個最小的數還可以找到一個最大的數,所以用雙向冒泡排序的交換的次數減少了,從而達到了優化起泡法的作用。