1. 程式人生 > >php氣泡排序細分析

php氣泡排序細分析

PHP有4種基本排序演算法,分別是:氣泡排序,選擇排序,插入排序,快速排序。

本篇文章給初學者細講下氣泡排序。

首先是一個數組:

$ars = [4,3,5,9,6,2];

這是一個有6個元素的陣列,那麼開始使用氣泡排序,首先理解下氣泡排序,原理簡單說明就是:兩兩比較,值大的往後放

那麼問題來了,一共要比較多少次呢?我們先來看第一次比較

第一次:陣列的第一個元素跟第二個元素比較,4>3,所以,4要往後放 [3,4,5,9,6,2]

第二次:陣列的第二個元素(這時候已經是4了,不是3了)跟第三個元素比較,4<5,不動 [3,4,5,9,6,2]

第三次:陣列的第三個元素跟第四個元素比較,5<9,不動 [3,4,5,9,6,2]

第四次:陣列的第四個元素跟第五個元素比較,9>6,9要往後放 [3,4,5,6,9,2]

第五次:陣列的第五個元素跟第六個元素比較,9>2,9要往後放 [3,4,5,6,2,9]

第六次:第六個元素沒有比較物件,所以結束了(很多人迷惑為什麼程式碼是那樣寫的,問題可能就在這裡)

5次比較下來,只得到一個9在最後面,那麼就需要迴圈來遍歷不斷的進行第二輪的比較

注意:第二輪比較只需要4次,因為上面5次比較已經得到最大值了,也就是說已經冒泡成功了一個

由此可以得到邏輯:

1、迴圈輪次:陣列長度-1次,(為什麼減一?看上面第六次的解釋)

2、每輪需要迴圈的次數:陣列的長度-當前正在迴圈的輪次(解釋:因為每迴圈一輪就會冒泡一次,已經冒泡成功了的就不需要再進行比較了,拿上面的陣列為例:一共5輪,每輪冒泡後,進入下一輪的迴圈就要減去上一輪,也就是說第二輪只需要迴圈4次)

3、每輪每次的迴圈比較是前一個元素跟後一個元素比較,上面5次解釋已經說的很清楚了

4、每次得到的結果,如果符合大小對比,就把大的值往後放,也就是值對調

由上面的邏輯可得到如下程式碼:

<?php
$ars = [4,3,5,9,6,2];
$len = count($ars);
for($i=1;$i<$len;$i++){
    //此迴圈是控制一共要多少輪
    for($k=0;$k<$len-$i;$k++){
        //此迴圈是控制每輪需要迴圈多少次
        if($ars[$k] > $ars[$k+1]){
            //此判斷是比較值的大小,進行值對調
            $temp = $ars[$k+1];
            $ars[$k+1] = $ars[$k];
            $ars[$k] = $temp;
        }
    }
}
?>

如果你要封裝成一個類,那麼請複製下面的程式碼:

<?php
/**
 * @author 程式碼要往死裡寫才有用
 * @since 2018.11.18 20:28
 * PHP氣泡排序類
 */
class Mp 
{
    public $arrays;
    public $len;

    /**
     * 建構函式
     * 初始化陣列
     */
    public function __construct($array_to)
    {
        //如果可以,你可以加上變數型別控制
        $this->arrays = $array_to;
        $this->len = count($array_to);
    }

    /**
     * 氣泡排序
     */
    public function getMp()
    {
        try
        {
            for($i=1;$i<$this->len;$i++){
                for($k=0;$k<$this->len-$i;$k++){
                    if($this->arrays[$k] > $this->arrays[$k+1]){
                        $up = $this->arrays[$k+1];
                        $this->arrays[$k+1] = $this->arrays[$k];
                        $this->arrays[$k] = $up;
                    }
                }
            }
        } catch( Exception $e )
        {
            echo 'Caught exception: ',  $e->getMessage(), "\n";
        }
        return $this->arrays;
    }
}
?>

其他排序,後文更進!