PHP五種常見演算法
阿新 • • 發佈:2019-02-18
氣泡排序:
快速排序:<?php /** * Created by PhpStorm. * User: maguanya * Date: 2018/1/9 * Time: 下午1:38 * 氣泡排序 */ function bubble($arr) { if (!is_array($arr)) { return '引數必須是一個一維陣列'; } $len = count($arr); if ($len <= 1) { return $arr; } for ($i=1; $i<$len; $i++) { for ($j=0; $j<$len-$i; $j++) { if ($arr[$j] > $arr[$j+1]) { list($arr[$j], $arr[$j+1]) = [$arr[$j+1], $arr[$j]]; } } } return $arr; } // 先定義一個數組 $arr = ['9', '2', '4', '1', '7', '3', '5', '8']; $fun = bubble($arr); var_dump($fun);
<?php /** * Created by PhpStorm. * User: maguanya * Date: 2018/1/11 * Time: 下午2:23 * 快速排序 * 全部的數都和陣列的第一個數作比較,比第一個數字小的放到一個空數組裡面,比第一個數字大的放到另一個空數組裡面, * 因為都是和第一個數字進行判斷的,所以是從陣列的下表為1的開始迴圈的,並且迴圈次數是陣列長度減1, * 然後再進行遞迴呼叫自身,知道長度為1或0 */ function quick($arr){ $len = count($arr); //陣列長度 if ($len <= 1) { return $arr; } $left = $right = []; //定義兩個空陣列 for ($i=1; $i<$len; $i++) { if ($arr[$i] < $arr[0]) { $left[] = $arr[$i]; } else { $right[] = $arr[$i]; } } $left = quick($left); $right = quick($right); print_r($right); return array_merge($left,array($arr[0]),$right); } $arr = ['9', '2', '4', '1', '7', '3', '5', '8']; $res = quick($arr); var_dump($res);
選擇排序:
折半查詢:<?php /** * Created by PhpStorm. * User: maguanya * Date: 2018/1/12 * Time: 下午2:08 * 選擇排序 * 外層的迴圈是陣列長度是幾就迴圈多少次,內層的迴圈是永遠比上一次的迴圈次數少一次, * 排序規則:先拿陣列的第一個元素依次作比較,迴圈出最大或最小的元素, * 然後進行放到需要迴圈的這幾個元素的最後一個位置, * 下一次再迴圈的時候就比上一次迴圈次數少一次, * 所以放到最後的就不會做比較 */ function select($arr) { $len = count($arr); for ($i=0; $i<$len; $i++) { for ($j=$i+1; $j<$len; $j++) { if ($arr[$i] > $arr[$j]) { list($arr[$i], $arr[$j]) = [$arr[$j], $arr[$i]]; } } } return $arr; } $arr = ['9', '2', '4', '1', '7', '3', '5', '8']; $res = select($arr); var_dump($res);
<?php
/**
* Created by PhpStorm.
* User: maguanya
* Date: 2018/1/12
* Time: 下午2:43
* 折半查詢
* $arr:要查詢的陣列;$val:要查詢的值
*/
//遞迴方式
function bin_recur_search($arr,$val){
global $time;
if(count($arr) >= 1){
$mid = intval(count($arr) / 2);
$time++;
if($arr[$mid] == $val){
return '值為:'.$arr[$mid].'<br>查詢次數:'.$time.'<br>';
}elseif($arr[$mid] > $val){
$arr = array_splice($arr,0,$mid);
return bin_recur_search($arr, $val);
}else{
$arr = array_slice($arr,$mid + 1);
return bin_recur_search($arr, $val);
}
}
return '未找到'.$val;
}
//非遞迴方式
function bin_search($arr,$val){
if(count($arr) >= 1){
$low = 0;
$high = count($arr);
$time = 0;
while($low <= $high){
$time++;
$mid = intval(($low + $high)/2);
if($val == $arr[$mid]){
return '索引:'.$mid.'<br>值為:'.$arr[$mid].'<br>查詢次數:'.$time;
}elseif($val > $arr[$mid]){
$low = $mid + 1;
}else{
$high = $mid - 1;
}
}
}
return '未找到'.$val;
}
$arr = ['9', '2', '4', '1', '7', '3', '5', '8'];
echo '遞迴方式結果:'.'<br>'.bin_recur_search($arr, 2);
echo '<br>';
echo '非遞迴方式結果:'.'<br>'.bin_search($arr, 2);
斐波那且數列:
<?php
/**
* Created by PhpStorm.
* User: maguanya
* Date: 2018/1/13
* Time: 上午10:26
* 斐波那且數列
*/
//顯示陣列
function fib($n){
$array = array();
$array[0] = 1;
$array[1] = 1;
for($i=2;$i<$n;$i++){
$array[$i] = $array[$i-1]+$array[$i-2];
}
return $array;
}
//顯示斐波那且數列中第$n個數的值
function fib_recursive($n){
if($n==1 || $n==2){
return '1';
}else{
return fib_recursive($n-1)+fib_recursive($n-2);
}
}
var_dump(fib(10));
echo '<br>';
echo fib_recursive(3);