首頁  >  文章  >  php教程  >  PHP冒泡排序(Bubble Sort)演算法詳解

PHP冒泡排序(Bubble Sort)演算法詳解

大家讲道理
大家讲道理原創
2016-11-11 09:26:051412瀏覽

前言

冒泡排序大概的意思是依序比較相鄰的兩個數,然後根據大小做出排序,直至最後兩位數。由於排序過程中總是小數往前放,大數往後放,相當於氣泡往上升,所以稱為冒泡排序。但其實在實際過程中也可以根據自己需要反過來用,大樹往前放,小數往後放。

實戰

直接上程式碼:

<?php/**
 * 冒泡排序算法示例
 */// 这里以一维数组做演示$demo_array = array(23,15,43,25,54,2,6,82,11,5,21,32,65);// 第一层for循环可以理解为从数组中键为0开始循环到最后一个for ($i=0;$i<count($demo_array);$i++) {    // 第二层将从键为$i的地方循环到数组最后
    for ($j=$i+1;$j $demo_array[$j]) {            $tmp            = $demo_array[$i]; // 这里的tmp是临时变量
            $demo_array[$i] = $demo_array[$j]; // 第一次更换位置
            $demo_array[$j] = $tmp;            // 完成位置互换
        }
    }
}// 打印结果集echo &#39;&#39;;
var_dump($demo_array);echo &#39;&#39;;

運作結果:

array(13) {
  [0]=>  int(2)
  [1]=>  int(5)
  [2]=>  int(6)
  [3]=>  int(11)
  [4]=>  int(15)
  [5]=>  int(21)
  [6]=>  int(23)
  [7]=>  int(25)
  [8]=>  int(32)
  [9]=>  int(43)
  [10]=>  int(54)
  [11]=>  int(65)
  [12]=>  int(82)
}

從上面結果中,我們可以看出,數組中鍵值順序已經被改變,排序成功。

如果說上面的演算法是將陣列中的鍵值依照值得大小從小到大排序,那麼反之從大到小怎麼操作呢?

很簡單,只要修改一個比較符號就可以了,如下:

<?php/**
 * 冒泡排序算法示例
 */// 这里以一维数组做演示$demo_array = array(23,15,43,25,54,2,6,82,11,5,21,32,65);// 第一层for循环可以理解为从数组中键为0开始循环到最后一个for ($i=0;$i<count($demo_array);$i++) {    // 第二层将从键为$i的地方循环到数组最后
    for ($j=$i+1;$j<count($demo_array);$j++) {        // 比较数组中相邻两个值的大小
        if ($demo_array[$i] < $demo_array[$j]) {            $tmp            = $demo_array[$i]; // 这里的tmp是临时变量
            $demo_array[$i] = $demo_array[$j]; // 第一次更换位置
            $demo_array[$j] = $tmp;            // 完成位置互换
        }
    }
}// 打印结果集echo &#39;&#39;;
var_dump($demo_array);echo &#39;&#39;;

運行結果:

array(13) {
  [0]=>  int(82)
  [1]=>  int(65)
  [2]=>  int(54)
  [3]=>  int(43)
  [4]=>  int(32)
  [5]=>  int(25)
  [6]=>  int(23)
  [7]=>  int(21)
  [8]=>  int(15)
  [9]=>  int(11)
  [10]=>  int(6)
  [11]=>  int(5)
  [12]=>  int(2)
}

就這樣,輕鬆地改變了順序。

延伸

如果仔細觀察以上程式碼,就會發現有一個地方值得關注,就是互換變數值得地方。沒錯,這也是冒泡中的核心要點,這個技巧掌握了,以後同樣可以用到其他地方。

這裡我們就稍微聊聊這個。

原理:

現在有A、B兩個變量,需求是將其值互換。

看到題目,我們首先可能會想到直接賦值,但是如果直接賦值,不論先將誰賦值給誰,其中一個必定會被覆蓋,由此我們可以想出再弄出第三個變量C,暫時儲存A或B中的值,這樣就可以達到需求目標了。

$c = $a; // 暂存
$a = $b; // b给a
$b = $c; // 暂存的a值再给b


註:其實不需要第三個變量,也是可以達到互換A、B變量值的,可以藉助substr()、str_replace()等方法,這裡因為是介紹冒泡排序的,所以介紹冒泡排序的,所以介紹冒泡排序的,所以不過多延伸了。

總結

關於冒泡排序的就這麼多,歸納起來,主要就是兩點:

  • 循環比較

  • 交換鍵值

🎜交換鍵值🎜🎜🎜🎜🎜🎜鍵值當然,關於冒泡排序的演算法還有很多,這裡只是其中一種,有興趣的同學可以自己研究下。 🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn