前言
冒泡排序大概的意思是依序比較相鄰的兩個數,然後根據大小做出排序,直至最後兩位數。由於排序過程中總是小數往前放,大數往後放,相當於氣泡往上升,所以稱為冒泡排序。但其實在實際過程中也可以根據自己需要反過來用,大樹往前放,小數往後放。
實戰
直接上代碼:
<?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 '<pre class="brush:php;toolbar:false">'; 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 '<pre class="brush:php;toolbar:false">'; 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()等方法,這裡因為是介紹冒泡排序的,所以不過多延伸了。
總結
關於冒泡排序的就這麼多,歸納起來,主要就是兩點:
循環比較
交換鍵值
能夠完成這兩點,基本上就OK了,當然,關於冒泡排序的演算法還有很多,這裡只是其中一種,有興趣的同學可以自己研究下。