冒泡排序也是一種簡單直觀的排序算法。其思想是:它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
下面我們通過一個簡單的圖例來了解一下這個冒泡的過程
起始位置為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²)。所以說在實際情況中如果數據量很大的話也不一定我們會選擇冒泡排序來實現排序。
但是我個人覺得冒泡排序和 選擇排序 可以說是其他排序的基礎,所以我們有必要去了解冒泡排序。
希望本文對大家有所幫助。