//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;
}