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

前言

冒泡排序大概的意思是依次比較相鄰的兩個數,而後根據大小作出排序,直至最後兩位數。因爲在排序過程當中老是小數往前放,大數日後放,至關於氣泡往上升,因此稱做冒泡排序。但其實在實際過程當中也能夠根據本身須要反過來用,大樹往前放,小數日後放。php

實戰

直接上代碼:算法

<?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 '<pre>';
var_dump($demo_array);
echo '</pre>';

運行結果:數組

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)
}

從上面結果中,咱們能夠看出,數組中鍵值順序已經被改變,排序成功。code

若是說上面的算法是將數組中的鍵值按照值得大小從小到大進行排序,那麼反之從大到小怎麼操做呢?排序

很簡單,只要修改一個比較符號就能夠了,以下:for循環

<?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 '<pre>';
var_dump($demo_array);
echo '</pre>';

運行結果:變量

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()等方法,這裏由於是介紹冒泡排序的,因此不過多延伸了。

總結

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

  1. 循環比較

  2. 交換鍵值

可以完成這兩點,基本就OK了,固然,關於冒泡排序的算法還有不少,這裏只是其中一種,有興趣的同窗能夠本身研究下。

相關文章
相關標籤/搜索