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;
}
}
?>
其他排序,後文更進!