1. 程式人生 > >氣泡排序的雙重迴圈的簡單說明

氣泡排序的雙重迴圈的簡單說明

冒泡(起泡)排序網上一搜有很多,我這裡只是記錄下我的感想:

氣泡排序裡有這麼一段:

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;

}