冒泡排序的輪數與次數

首先先貼出冒泡排序的算法原理(來自百度百科):算法

冒泡排序算法的原理以下:數組

  1. 比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。app

  2. 對每一對相鄰元素作一樣的工做,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。spa

  3. 針對全部的元素重複以上的步驟,除了最後一個。code

  4. 持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。排序

下面貼出兩端代碼,都是常見的冒泡排序:索引

第一種:ip

$arr=array(3,5,2,4,1);
function maopao($arr){
    $len=count($arr);
    for($i=1;$i<$len;$i++){
        echo $i;
        for($j=0;$j<$len-$i;$j++){
            echo $j;
            if($arr[$j]>$arr[$j+1]){
                $tmp=$arr[$j];
                $arr[$j]=$arr[$j+1];
                $arr[$j+1]=$tmp;
            }
        }
        print_r($arr);
    }
}
maopao($arr);

打印結果爲:element

1
0
1
2
3
Array
(
    [0] => 3
    [1] => 2
    [2] => 4
    [3] => 1
    [4] => 5
)
2
0
1
2
Array
(
    [0] => 2
    [1] => 3
    [2] => 1
    [3] => 4
    [4] => 5
)
3
0
1
Array
(
    [0] => 2
    [1] => 1
    [2] => 3
    [3] => 4
    [4] => 5
)
4
0
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

能夠看到這種方法輪次數爲4次,比較次數也在遞減。get

第二種:

$arr=array(3,5,2,4,1);
function maopao($arr){
    $len=count($arr);
    for($i=0;$i<$len;$i++){
        echo $i;
        for($j=0;$j<$len-1;$j++){
            echo $j;
            if($arr[$j]>$arr[$j+1]){
                $tmp=$arr[$j];
                $arr[$j]=$arr[$j+1];
                $arr[$j+1]=$tmp;
            }
        }
        print_r($arr);
    }
}
maopao($arr);

打印結果爲:

0 0123
Array
(
    [0] => 3
    [1] => 2
    [2] => 4
    [3] => 1
    [4] => 5
)
1 0123
Array
(
    [0] => 2
    [1] => 3
    [2] => 1
    [3] => 4
    [4] => 5
)
2 0123
Array
(
    [0] => 2
    [1] => 1
    [2] => 3
    [3] => 4
    [4] => 5
)
3 0123
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
4 0123
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

能夠看到這種方式輪次數爲5次,而且每次都會有4次的比較。

這兩種方式均可以完成冒泡排序,可是第一種明顯優於第二種,緣由就是第一種的時間上明顯縮短。

其次經過分析也可得知,冒泡排序作爲一個簡單的算法也有着優劣,

第一種方法:

  1. 第一輪判斷將最大的一個數字取出並放在數組最後;
  2. 由於第一輪已經知道最大的數字而且排到最後,因此第二輪判斷時就不須要再去和最後一個進行判斷,也就是  $j<$len-$i 的由來,這個表達式是經過數組總長減去當前輪次數得出需比較次數,同時 $j=0; 確保所取得兩個數字從數組第一個也就是最小那個開始
  3. 第二輪比較結束後獲得第二大的數字,因此第三輪比較就能夠不去比較最後兩個
  4. 以此類推最後將全部輪次比較完以後得出拍好序的數組

 

再此過程中的疑問:

       (1)爲何 $i=1 ,這樣設置的意義是什麼?

     答:好比一個數組長度爲5 ,每次比較得出一個最大值,那麼當比較4次以後就獲得了最大的4個數字,剩下的那個再也不去比較也可知道是最小數。

       (2)$j<$len-$i ;   這樣不會有問題嗎?

       答:不會,就如上面所說,當我第一次取得最大數後,以後比較時我就已經得知最後一位是最大,不去比較也能夠,而索引數組取值是從 $arr[0] 開始的。

相關文章
相關標籤/搜索