每個 菜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 協議》,轉載必須註明作者和本文連結