排序演算法–氣泡排序

joker丶牧羊人發表於2019-02-28

分析:

一、氣泡排序的實質

氣泡排序的實質就是:將相鄰的兩個元素進行比較,按照統一的規則(從大到小、從小到大)重新調整順序

二、演算法描述(從小到大)

1、比較相鄰的元素,如果第一個比第二個大,就交換它們兩個;
2、依次比較相鄰的元素,直到陣列元素比較完成,那麼這時,最大的元素就應該在陣列的最後面;
3、不斷重複 1 和 2 的操作

三、動圖演示
動圖-氣泡排序.gif
四、邏輯分析和分步說明
準備: 我們準備一個測試陣列 $arr = [2,5,3,6,1]; 長度為 $len;

1、根據演算法描述,我們會想到,相鄰兩個元素進行比較,需要做一個迴圈;而最多會比較 $len - 1 次,所以得到如下程式碼

邏輯流程分析1-程式碼塊.png

執行程式碼得到的陣列是:[2,3,5,1,6],成功將陣列中最大元素 6 排序到了最後面。

邏輯流程分析1-結果圖.png

由此我們可以看出,該迴圈一次只能成功排序一個元素,其餘元素是沒有成功排序的。

2、由1的結果說明,當前邏輯每次只能成功排序一個元素,那麼我們給定的陣列有多少個元素,就應該需要執行多少次當前的排序邏輯,由此我們就需要另外一個迴圈來控制陣列中所有元素來執行當前的邏輯。所以,我們修改程式碼為如下格式:

邏輯流程分析2-程式碼塊.png

執行程式碼得到正確的結果:[1,2,3,5,6]

邏輯流程分析2-結果圖.png

3、雖然我們在 2 中已經得到了正確的排序陣列,但是我們發現 每次外層迴圈(元素個數 $m)的時候, 內層迴圈(比較次數 $n)都是 4 次;細細一想,當 $m 迴圈第一次時,已經將 最大元素 6 排出來了,那麼我們下一次的時候 可以不需要再去比較一次 6 了,以此類推,外迴圈每迴圈一次,內迴圈的比較次數就可以少比較一次,由此:我們可以修改優化程式碼如下:

邏輯流程分析3-程式碼塊.png

執行程式碼得到正確結果:[1,2,3,5,6]

邏輯流程分析3-結果圖.png

根據以上分析和除錯,我們就可以得到相對完整的氣泡排序實現程式碼,如下:

public function bubble_sort($arr)
{
    $len = count($arr);
    for($m = 0; $m < $len; $m++)// 迴圈次數
    {
        for($n = 0; $n < $len - 1 - $m; $n++) // 比較次數
        {
            if($arr[$n] > $arr[$n + 1])
            {
                $tmp = $arr[$n];
                $arr[$n] = $arr[$n+1];
                $arr[$n+1] = $tmp;
            }
        }
    }
}
複製程式碼

【注:部分資源來源:www.cnblogs.com/onepixel/ar…
【如若文件有錯誤,歡迎大家不吝賜教。如果發現有侵權等行為,請聯絡我,我將對應處理,謝謝~~~】

相關文章