PHP冒泡排序


這個應該是最大眾的排序了。也算是簡單排序算法中知名度最高的。

冒泡排序的思路是怎么樣的呢?

首先就是先比較相鄰的兩個元素,如果滿足條件,就交換,否則不動。

然后是再比較接下來的兩個相鄰的元素,然后滿足條件就交換,否則依然不動。

依次循環操作下去,最終一個元素,會固定在最下邊。

 

舉例:

數組有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));

這個寫法,大致看上去和標准的冒泡排序寫法非常相似,思路也非常像。

這個排序的思路是怎么樣呢?

首先,假設還是實現數組的從小到大的排序。

第一輪循環,用數組的第一個元素,逐一和第二個一直到最后一個元素比對,每次對比,只要誰小,誰就和第一個元素交換。

第二輪循環,則從第二個元素開始,逐一和第三個到最后一個比對,誰小,就和第二個元素交換。一直這樣循環比對,直到最后。

這每輪循環,都把最小的那個元素上浮到了最頂上。

標准的冒泡排序是每一輪把最大的確定在最后,而這個排序沒一輪把最小的確定在最前邊。

可以說這兩個真的算是比較像了,當然,這個排序的形式,也很像選擇排序

目前為止,咱這也說不好,這個后邊的排序,到底算冒泡排序?還算選擇排序呢?或者他有自己的名字。

有了解的朋友,還望多指教。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM