老生常談之 PHP 基礎排序演算法

wenber發表於2020-03-31
    每個 菜B 心中都有一個夢, 那就是 牛B. 讓我們一起向前往 牛B 的路上再燒把火吧.

                                                                                        我說的

當王老師第一次把6,4,7,2,9,8,1七個數字寫到黑板上並開始提問:“ 你們有什麼辦法讓這一坨數字從小到大排列呢? ”,作為菜B,你的第一想法肯定是先把腦袋深深淹沒在書堆後並默唸:“ 千萬別點老子 ”。

                    把生活解釋成程式碼叫程式設計, 把程式碼解釋成生活叫逆向程式設計.

                                                                                    還是我說的

第一步, 放程式碼, 就是這麼直接了當

function bubble(array $arr) : array 
{
    $start  = microtime(true);
    $length = count($arr);
    $swap = true;

    for ($outer = 0; $outer < $length && $swap; $outer++) {

        $swap = false;

        for ($inner = $length - 1; $inner > $outer; $inner--) {
            if ($arr[$inner] < $arr[$inner - 1]) {
                $temp            = $arr[$inner];
                $arr[$inner]     = $arr[$inner - 1];
                $arr[$inner - 1] = $temp;
                $swap            = true;
            }
        }
    }

    $end = microtime(true);

    return ['排序陣列' => $arr, '氣泡排序執行時間' => $end - $start];
}

建立資料前, 先來了解下人物陣列: 大胖=90Kg, 中胖=80Kg, 超胖=100Kg, 巨胖=200Kg, 小胖=70Kg 就這幾個吧. 不要在體重上計較是否命名合適, 我說了算.
資料建立完成, 然後命名為$fatFat, 他們按照上邊描述的位置(陣列下標)已經站好了, 要開始比體重了.

  • 1.1 王老師來數一下. $length = count($fatFat);

  • 1.2 開始迴圈比較了, 第一層的迴圈是控制發起挑戰次數並確定挑戰位置的, 條件為參與的胖子不得超過總胖子 (小於 $length), 挑戰順序為依次累加.

  • 1.3 發起挑戰的是小胖 ($length - 1), 條件是應戰者位置必須大於挑戰開始位置,只有這樣才能完成應戰者後續比賽, 所以第二層迴圈是控制挑戰者順序及位置的. 挑戰者順序為依次遞減.

  • 1.4 步驟1.3中, 條件滿足 ($inner > $outer), 小胖順利過關, 然後開始了冒泡的經典過程:一戰到底.

    為什麼叫一戰到底呢? (留做閱後感吧)

  • 1.5 小胖 ($inner) 與巨胖 ($inner - 1) 比賽後勝出 (“是的, 一胖毀所有”), 要換座位了, 先把勝了的小胖單獨拎出來放到 $temp 裡 (因為$inner比較輕), 然後把巨胖拖到原本屬於小胖的位置, 即 ($arr[$inner] = $arr[$inner - 1]), 接著讓被寄存的小胖 ($temp) 坐到巨胖的板凳上($arr[$inner - 1] = $temp)

    此時, 我們要理一下胖子們的位置, 0=>大胖, 1=>中胖, 2=> 超胖, 3=>小胖, 4=>巨胖.
    沒有反應過來的同學可以回顧下 步驟1.5中, 關於換座位的描述.

  • 1.6 小胖接下來要重複 步驟1.3 ~ 步驟1.5 的騷操作, 直到坐上第一(下標為0)的寶座為止.

  • 1.7 開始新一輪挑戰輪迴賽, 即步驟1.2

  • 1.8 所有挑戰者全部挑戰完畢.

本文中的關於氣泡排序的文字描述是按照從後往前展開的. 程式碼來自於老李部落格, 更多的解釋可以去老李的部落格瀏覽
老李乃泥腿子一枚, 但是卻早早站到了 牛B 的路上. 要向我輩楷模學習.

申明: 文中所言沒有歧視胖子的意思, 只是為了適應此境所擬, 若有不適, 請聯絡我修改.

參考文章:排序演算法之氣泡排序

本作品採用《CC 協議》,轉載必須註明作者和本文連結

故地有明月, 何慕異鄉圓.

相關文章