PHP冒泡排序(Bubble Sort)演算法詳解

來源:互聯網
上載者:User

前言

冒泡排序大概的意思是依次比較相鄰的兩個數,然後根據大小做出排序,直至最後兩位元。由於在排序過程中總是小數往前放,大數往後放,相當於氣泡往上升,所以稱作冒泡排序。但其實在實際過程中也可以根據自己需要反過來用,大樹往前放,小數往後放。

實戰

直接上代碼:

<?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>';var_dump($demo_array);echo '</pre>';

運行結果:

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>';var_dump($demo_array);echo '</pre>';

運行結果:

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了,當然,關於冒泡排序的演算法還有很多,這裡只是其中一種,有興趣的同學可以自己研究下。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.