冒泡排序


//file 冒泡排序1.cpp

//例:將有10個元素的數組用冒泡排序法按升序排列


// 冒泡排序(設按升序)算法:
//
//   第一趟兩兩比較:從第一個元素(0下標)開始進行相鄰兩個元素的比較,
// 若前者比後者大,則兩者交換位置,再按同樣的方法比較下兩個相鄰元素,一直
// 比較到最後兩個元素(a[n-2]和a[n-1])。這樣,經第一趟兩兩比較後,排在最後
// 的元素(下標爲n-1)爲最大元素(已經排好序)。
//
//   第二趟兩兩比較:從第一個元素開始再進行相鄰兩個元素的比較,規則同上,一
// 直比較到未排序元素的最後兩個元素(a[n-3]和a[n-2])。這樣,經第二趟兩兩
// 比較後,排在最後的兩個元素已經排好序。
//
//  依次類推,共最多進行n-1趟(最壞情況下)以後,就可以將n個元素都排好序。


#include"iostream.h"

void bubble(int [],int);//or void bubble(int *,int);

void main(void)
{
 int array[]={1,5,4,3,6,2,7,8,10,9};//最壞情況下,需要進行9輪

 int lenofarray=sizeof(array)/sizeof(int);//元素個數

 cout<<"排序前的各元素:/n";
 for(int i=0;i<lenofarray;i++) //按原始順序輸出個元素值
  cout<<array[i]<<",";

 cout<<endl<<endl;
 bubble(array,lenofarray);//調用冒泡排序函數

 cout<<"/n/nafter bubble:/n";
 for(i=0;i<lenofarray;i++) //排序後數組array的各元素值有改變!
  cout<<array[i]<<",";//   冒泡排序2.cpp   也有改變!
 
 cout<<endl;
}

void bubble(int a[],int size)
{
int i,temp,flag;//增加一個標誌flag,以便一旦已經排好序,則提前結束,
                  //而不一定都要經過size-1輪

cout<<"正在冒泡排序:/n";

for(int pass=1;pass<size;pass++){  //最壞時最多比較size-1輪
 
 flag=0;

 for(i=0;i<size-pass;i++)  //第pass輪時,需要比較次數爲:size-pass
  if(a[i]>a[i+1])  //交換a[i]和a[i+1]
   {
   flag+=1;
   temp=a[i];a[i]=a[i+1];a[i+1]=temp;
   }

 //if(flag==0) break;//若本輪結束時,已沒有交換元素,則說明已排好序。

//以下輸出經此輪排序後的結果
 
for(i=0;i<size;i++){
 if(a[i]==a[size-pass])  cout<<"|"<<a[i]<<",";
 
 else cout<<a[i]<<",";
 }

if(flag==0) break;//若本輪結束時,已沒有交換元素,則說明已排好序。

cout<<endl<<endl;

 }

 

 

 

 

//file 冒泡排序2.cpp 

//例:將有10個元素的數組用冒泡排序法按升序排列


// 冒泡排序(設按升序)算法:
//
//   第一趟兩兩比較:從第一個元素(0下標)開始進行相鄰兩個元素的比較,
// 若前者比後者大,則兩者交換位置,再按同樣的方法比較下兩個相鄰元素,一直
// 比較到最後兩個元素(a[n-2]和a[n-1])。這樣,經第一趟兩兩比較後,排在最後
// 的元素(下標爲n-1)爲最大元素(已經排好序)。
//
//   第二趟兩兩比較:從第一個元素開始再進行相鄰兩個元素的比較,規則同上,一
// 直比較到未排序元素的最後兩個元素(a[n-3]和a[n-2])。這樣,經第二趟兩兩
// 比較後,排在最後的兩個元素已經排好序。
//
//  依次類推,共最多進行n-1趟(最壞情況下)以後,就可以將n個元素都排好序。


#include"iostream.h"

//void bubble(int [],int);//or void bubble(int *,int);

void main(void)
{
 int array[]={1,5,4,3,6,2,7,8,10,9};//最壞情況下,需要進行9輪

 int lenofarray=sizeof(array)/sizeof(int);//元素個數

 cout<<"排序前的各元素:/n";
 for(int i=0;i<lenofarray;i++) //按原始順序輸出個元素值
  cout<<array[i]<<",";

 cout<<endl<<endl;

    cout<<"正在冒泡排序:/n";

 int temp,flag;//增加一個標誌flag,以便一旦已經排好序,則提前結束,
                  //而不一定都要經過size-1輪

 

   for(int pass=1;pass<lenofarray;pass++){  //最壞時最多比較size-1輪
 
    flag=0;

    for(i=0;i<lenofarray-pass;i++)  //第pass輪時,需要比較次數爲:size-pass
     if(array[i]>array[i+1])  //交換a[i]和a[i+1]
   {
   flag+=1;
   temp=array[i];array[i]=array[i+1];array[i+1]=temp;
   }//end of inner for

    if(flag==0) break;//若本輪結束時,已沒有交換元素,則說明已排好序。

   //以下輸出經此輪排序後的結果,並在已經排序的元素前加標誌‘|’
 
      for(i=0;i<lenofarray;i++){//輸出經過本趟排序後的全部元素
      if(array[i]==array[lenofarray-pass])  cout<<"|"<<array[i]<<",";
 
      else cout<<array[i]<<",";
  }

        cout<<endl<<endl;

 }//end of outer for


  cout<<"/n/nafter bubble:/n";

  for(i=0;i<lenofarray;i++) //排序後數組array的各元素值有改變!
  cout<<array[i]<<",";//   冒泡排序2.cpp   也有改變!
 
  cout<<endl;
}

 

 

 

發佈了36 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章