前言
冒泡排序大概的意思是依序比較相鄰的兩個數,然後根據大小做出排序,直至最後兩位數。由於排序過程中總是小數往前放,大數往後放,相當於氣泡往上升,所以稱為冒泡排序。但其實在實際過程中也可以根據自己需要反過來用,大樹往前放,小數往後放。
實戰
直接上程式碼:
<?php/** * 冒泡排序算法示例 */// 这里以一维数组做演示$demo_array = array(23,15,43,25,54,2,6,82,11,5,21,32,65);// 第一层for循环可以理解为从数组中键为0开始循环到最后一个for ($i=0;$i<count($demo_array);$i++) { // 第二层将从键为$i的地方循环到数组最后 for ($j=$i+1;$j $demo_array[$j]) { $tmp = $demo_array[$i]; // 这里的tmp是临时变量 $demo_array[$i] = $demo_array[$j]; // 第一次更换位置 $demo_array[$j] = $tmp; // 完成位置互换 } } }// 打印结果集echo ''; var_dump($demo_array);echo '';
運作結果:
array(13) { [0]=> int(2) [1]=> int(5) [2]=> int(6) [3]=> int(11) [4]=> int(15) [5]=> int(21) [6]=> int(23) [7]=> int(25) [8]=> int(32) [9]=> int(43) [10]=> int(54) [11]=> int(65) [12]=> int(82) }
從上面結果中,我們可以看出,數組中鍵值順序已經被改變,排序成功。
如果說上面的演算法是將陣列中的鍵值依照值得大小從小到大排序,那麼反之從大到小怎麼操作呢?
很簡單,只要修改一個比較符號就可以了,如下:
<?php/** * 冒泡排序算法示例 */// 这里以一维数组做演示$demo_array = array(23,15,43,25,54,2,6,82,11,5,21,32,65);// 第一层for循环可以理解为从数组中键为0开始循环到最后一个for ($i=0;$i<count($demo_array);$i++) { // 第二层将从键为$i的地方循环到数组最后 for ($j=$i+1;$j<count($demo_array);$j++) { // 比较数组中相邻两个值的大小 if ($demo_array[$i] < $demo_array[$j]) { $tmp = $demo_array[$i]; // 这里的tmp是临时变量 $demo_array[$i] = $demo_array[$j]; // 第一次更换位置 $demo_array[$j] = $tmp; // 完成位置互换 } } }// 打印结果集echo ''; var_dump($demo_array);echo '';
運行結果:
array(13) { [0]=> int(82) [1]=> int(65) [2]=> int(54) [3]=> int(43) [4]=> int(32) [5]=> int(25) [6]=> int(23) [7]=> int(21) [8]=> int(15) [9]=> int(11) [10]=> int(6) [11]=> int(5) [12]=> int(2) }
就這樣,輕鬆地改變了順序。
延伸
如果仔細觀察以上程式碼,就會發現有一個地方值得關注,就是互換變數值得地方。沒錯,這也是冒泡中的核心要點,這個技巧掌握了,以後同樣可以用到其他地方。
這裡我們就稍微聊聊這個。
原理:
現在有A、B兩個變量,需求是將其值互換。
看到題目,我們首先可能會想到直接賦值,但是如果直接賦值,不論先將誰賦值給誰,其中一個必定會被覆蓋,由此我們可以想出再弄出第三個變量C,暫時儲存A或B中的值,這樣就可以達到需求目標了。
$c = $a; // 暂存 $a = $b; // b给a $b = $c; // 暂存的a值再给b
註:其實不需要第三個變量,也是可以達到互換A、B變量值的,可以藉助substr()、str_replace()等方法,這裡因為是介紹冒泡排序的,所以介紹冒泡排序的,所以介紹冒泡排序的,所以不過多延伸了。
總結
關於冒泡排序的就這麼多,歸納起來,主要就是兩點:
循環比較
交換鍵值