PHP中涉及到多種排序,而冒泡排序應該是我用的最鬧心的一種排序,弄了老半天還是沒太懂,這篇簡單講述PHP冒泡排序的很適合像我一樣不太懂冒泡排序的東西看哦!
1.冒泡演算法
看了幾篇關於冒泡的文章,但是總是對於每次循環的邊界值思路講的比較籠統。
不是很容易被新手記住,我自己平常也是硬記下來的。
但是對於演算法,硬記,時間長了還是容易忘記,所以自己寫了一次,把每次思路盡量寫下來,便於理解,理解了容易加深映像,不容易忘記了。
氣泡演算法,核心是
1.循環比對 每次比對相鄰2個陣列的大小,然後將最大的陣列放到後面,這樣所有比對循環一次,就會把數組中最大的數放到數組最後
2. 然後重複循環(重複上面的比對循環):此時循環的時候最後一個值是不需要參加循環了,因為已經確定是最大的那個了。也就是說,重複循環,比對陣列越來越少。最後只剩下一個陣列元素了。循環結束
程式碼層看:
$arr=array(5,4,3,6,7,1,2,10,8,9);
先從兩兩比對開始看
if($arr[$i]>$arr[$i+1]){//相邻比较 这个应该比较容易理解吧 $tem=$arr[$i]; $arr[$i]=$arr[$i+1]; $arr[$i+1]=$tem; }
以上程式碼就是比對2個陣列相鄰的值大小,大的放後面。可以看出來 $i 最大就是數組索引前一位的,否則 $arr[$i+1]不存在了,無法比較。也就是說 $i<count($ar)-1;$i初始值為0
先從內層比對迴圈開始看
#一般for循環 這麼寫
for($i=0;$i<$xx;$i++){ if($arr[$i]>$arr[$i+1]){//相邻比较 这个应该比较容易理解吧 $tem=$arr[$i]; $arr[$i]=$arr[$i+1]; $arr[$i+1]=$tem; } }
上面思路說了,每次比對循環都是從開頭第一個元素開始所以$i 起始值為0, 重複循環一次,下次循環就少比對一個元素。這裡$xx要越來越小; 那這個$xx怎麼確定呢?
$xx第一次循環值是多少 ?上面兩兩比對得出結論 count($ar)-1
$xx 最後一次值該是多少呢?上面兩兩比對得出結論 是1。
也就是說$xx 為 count($arr)-$k $k是累加的比對循環可改為(重複循環每循環一次)
for($i=0;$i<count($arr)-$k;$i++){ if($arr[$i]>$arr[$i+1]){//相邻比较 $tem=$arr[$i]; $arr[$i]=$arr[$i+1]; $arr[$i+1]=$tem; } }
再看這個$k想想這個$k不就是隨著重複循環在累積的嗎? 把重複循環程式碼加上如下
我們再來看下$k是怎麼確定邊界值的上面說了, $xx 邊界值是count($arr)-1 到1 已經定義 那麼數學演算法$k邊界值也就出來了為1到 count($arr)-1
寫入到迴圈裡也就是$k=1;$k 整理下就是 希望大家可以看的懂,還是多練練比較好,有的時候我們不明白的知識,自己多寫兩遍寫著寫著就懂了! 以上是簡單的理解PHP冒泡排序的詳細內容。更多資訊請關注PHP中文網其他相關文章!for($k=1;$k<count($arr);$k++){
for($i=0;$i<count($arr)-$k;$i++){
if($arr[$i]>$[$i+1]){
$temparr= $arr[$i];
$arr[$i] =$arr[$i+1];
$arr[$i+1] = $temparr;
}
}
}