全面瞭解基礎排序演算法氣泡排序

氣泡排序也是一種簡單直觀的排序演算法。其思想是:它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

下面我們透過一個簡單的圖例來了解一下這個冒泡的過程

全面瞭解基礎排序演算法氣泡排序

氣泡排序原始資料

起始位置為0,依次比較相鄰的兩個元素。如果前面的元素大於後面的元素,則進行交換。

全面瞭解基礎排序演算法氣泡排序

氣泡排序過程

我們可以看出,待排序序列有多少個元素,就需要幾趟冒泡。但是在實際過程中,我們可以根據實際情況減少其冒泡的趟數。

就拿上例來說,我們看在第四趟冒泡完成以後就已經有序了。第五趟和第六趟冒泡過程並沒有產生元素的交換。所以說我們可以判斷,在一趟冒泡中如果沒有產生元素的交換,我們就終止冒泡的整個過程。這樣最後得到的序列同樣是有序的。

反應在程式中就是在每一趟冒泡的開始設定一個標誌位,預設為false。當有交換產生的時候將該標誌位設為true。在該趟冒泡過程結束以後,我們根據此標誌位來判斷是否有交換的產生。如果沒有交換產生的話,我們就直接結束整個冒泡過程。否則繼續下一趟冒泡。

根據上圖,我們來看一下實現氣泡排序的文字的步驟

1)比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。

3)針對所有的元素重複以上的步驟,除了最後一個。

4)持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

最後我們要將文字步驟轉換成程式碼實現

/** * 交換函式 */function swap(&$arr,$a,$b){ $t = $arr[$a]; $arr[$a] = $arr[$b]; $arr[$b] = $t;}function BubbleSort(&$arr){ $end = count($arr)-1; while($end>0){ for($i=0;$i<$end;$i++){ if($arr[$i]>$arr[$i+1]){ swap($arr,$i,$i+1); } } $end——; }}$arr = array(10,6,8,23,4,1,17,56,32,50,11,9);BubbleSort($arr);print_r($arr);

上述程式碼是將所有的冒泡過程都走了一遍,下面我們只需要將BubbleSort函式進行簡單的修改就可以實現上述我們說的標誌位來判斷是否有交換的產生。

function BubbleSort(&$arr){ $end = count($arr)-1; while($end>0){ $flag = false; //每次冒泡前 初始化標誌位為false for($i=0;$i<$end;$i++){ if($arr[$i]>$arr[$i+1]){ swap($arr,$i,$i+1); $flag = true; //有交換產生 將標誌位置為true } } if(!$flag) break; //如果沒有交換產生 則直接跳出迴圈 $end——; }}

其實帶標誌位的和不帶標誌位的程式在資料量很小的時候並沒有明顯的差別,所用時間應該沒有什麼差別。但是在資料量很大的時候其差別就會變得很明顯。但是話又說回來,氣泡排序並不是最好的排序演算法,其效率較其他的排序演算法低,時間複雜度為O(n²)。所以說在實際情況中如果資料量很大的話也不一定我們會選擇氣泡排序來實現排序。

但是我個人覺得氣泡排序和選擇排序可以說是其他排序的基礎,所以我們有必要去了解氣泡排序。

希望本文對大家有所幫助。