PHP五种常见算法,php五种
冒泡排序:
<?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);
PHP之友评论