排序演算法--氣泡排序(bubble sort)
阿新 • • 發佈:2018-11-06
氣泡排序是一個簡單的排序演算法,演算法複雜度n的平方,特點是兩兩比較,每次遍歷會將最大值或最小值放在最後,像冒泡一樣,每次的最大值或最小值,逐漸冒出,故名氣泡排序;
程式碼如下
void swap( int& a,int& b) {//資料交換的函式,這裡另類了一點,沒有定義中間變數交換值 a=a+b; b=a-b; a=a-b; } void bubble(int a[],n) { for(int i=0;i<n-1;i++)//遍歷的次數 { for(int j=0;j<n-j-i;j++)//每次遍歷進行兩兩比較 { if(a[j]>a[j+1]) swap(a[j],a[j+1]); } } }
其實,大家應該可以發現一個問題,假如a陣列是{1,2,4,3,5,6,7,8},這樣的陣列,上面的程式碼其實第一次遍歷就可以完成排序,而不用再進行其他無用的遍歷,造成浪費。
所以就出現了氣泡排序的優化版本:
void swap( int& a,int& b) {//資料交換的函式,這裡另類了一點,沒有定義中間變數交換值 a=a+b; b=a-b; a=a-b; } void bubble(int a[],n) {//其實優化版本僅僅就是增加一個flag,來表示是否有序了 bool flag=true;//必須設定為true,這樣才能進入第一次迴圈 for(int i=0;i<n-1 && flag;i++)//遍歷的次數 { flag=false;//改為false,如果有序的話,是不發生交換的,就不用遍歷了 for(int j=0;j<n-j-i;j++)//每次遍歷進行兩兩比較 { if(a[j]>a[j+1]) { swap(a[j],a[j+1]); flag=true;//發生交換了,就需要改為true,進行下一輪的遍歷 } } } }