氣泡排序的雙重迴圈的簡單說明
冒泡(起泡)排序網上一搜有很多,我這裡只是記錄下我的感想:
氣泡排序裡有這麼一段:
for(i=0;i<n-1;i++)
for(j=0;j>n-i-1;j++)//n是陣列長度,即元素個數
{...}//這裡是比較大小的程式碼段
為什麼裡面的迴圈判斷條件是j>n-i-1呢?
這要從氣泡排序原理說起:氣泡排序每迴圈一次,就把最大的數排在了最右邊(不信你試試),所以下次迴圈的時候就不用再迴圈這麼多個啦,只需要迴圈n-i次;至於為什麼還要-1,是因為j從0開始的。
另外,裡面的迴圈跟內迴圈for裡面的字母要一致,比如上面的例子就改用if (s[j]>s[j+1])...(交換);而不是用s[i]>s[i+1]甚至s[i]>s[j+1])。這點容易錯~
附上一段anyview的氣泡排序題和題解:(題解來自百度文庫)
/**********
【習題6.265】系統給定外部整型變數n和整型陣列a(不需要自行定義)。
編寫程式,用起泡法對陣列a中前n個元素(a[0],a[1],…,a[n-1])進行
分段排序,其中前一半為從大到小排序,後一半為從小到大排序,並把n個
數的平均值存在a[n]中,n為奇數時,位於中間點的數不需要排序。
**********/
void main()
{
int i,j;
float t,sum;
if(n%2==0)
{
for(i=0;i<n/2;i++)
for(j=0;j<n/2-i-1;j++)
if(a[j+1]>a[j])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=0;i<n/2;i++)
for(j=n/2;j<n-1-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
else
{
for(i=0;i<n/2-1;i++)
for(j=0;j<n/2-i-1;j++)
if(a[j+1]>a[j])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=0;i<n/2-1;i++)
for(j=n/2+1;j<n-1-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for (i=0;i<n;i++)
sum+=a[i];
a[n]=sum/n;
}