這個應該是最大眾的排序了。也算是簡單排序算法中知名度最高的。
冒泡排序的思路是怎么樣的呢?
首先就是先比較相鄰的兩個元素,如果滿足條件,就交換,否則不動。
然后是再比較接下來的兩個相鄰的元素,然后滿足條件就交換,否則依然不動。
依次循環操作下去,最終一個元素,會固定在最下邊。
舉例:
數組有5個元素從小到大排序,首先第一個和第二個比,第一個比第二個大,就交換,否則不操作
然后第二個和第三個比較,第二個大於第三個則交換,否則依然不動。直到對比到第四個和第五個對比。
經過一輪的循環對比,最大的數字就下沉到最下邊了。小的數字逐漸向上浮出。
1 // 冒泡排序 2 function bubble_sort($arr) 3 { 4 $len = count($arr); 5 for ($i = 0; $i < $len -1; $i++) {//循環對比的輪數 6 for ($j = 0; $j < $len - $i - 1; $j++) {//當前輪相鄰元素循環對比 7 if ($arr[$j] > $arr[$j + 1]) {//如果前邊的大於后邊的 8 $tmp = $arr[$j];//交換數據 9 $arr[$j] = $arr[$j + 1]; 10 $arr[$j + 1] = $tmp; 11 } 12 } 13 } 14 return $arr; 15 } 16 $arr = [5,2,4,7,9,4,2,6,8,3]; 17 print_r(bubble_sort($arr));
以上代碼呢,是標准的冒泡排序,代碼實現也完全符合冒泡排序的說法。
但是,在實際上,有很多人把冒泡排序寫成了另一種樣子。
1 //排序 2 function paixu($arr) 3 { 4 $len = count($arr); 5 for ($i = 0; $i < $len - 1; $i++) {//循環比對的輪數 6 for ($j = $i + 1; $j < $len; $j++) {//從第二個開始循環,循環到最后一個,逐一和第一個比較 7 if ($arr[$i] > $arr[$j]) {//前邊大於后邊的則交換 8 $tmp = $arr[$i]; 9 $arr[$i] = $arr[$j]; 10 $arr[$j] = $tmp; 11 } 12 } 13 } 14 return $arr; 15 } 16 $arr = [5,2,4,7,9,4,2,6,8,3]; 17 print_r(paixu($arr));
這個寫法,大致看上去和標准的冒泡排序寫法非常相似,思路也非常像。
這個排序的思路是怎么樣呢?
首先,假設還是實現數組的從小到大的排序。
第一輪循環,用數組的第一個元素,逐一和第二個一直到最后一個元素比對,每次對比,只要誰小,誰就和第一個元素交換。
第二輪循環,則從第二個元素開始,逐一和第三個到最后一個比對,誰小,就和第二個元素交換。一直這樣循環比對,直到最后。
這每輪循環,都把最小的那個元素上浮到了最頂上。
標准的冒泡排序是每一輪把最大的確定在最后,而這個排序沒一輪把最小的確定在最前邊。
可以說這兩個真的算是比較像了,當然,這個排序的形式,也很像選擇排序。
目前為止,咱這也說不好,這個后邊的排序,到底算冒泡排序?還算選擇排序呢?或者他有自己的名字。
有了解的朋友,還望多指教。