递推算法-解决斐波那契数列
公式:F(N) = F(N - 1) + F(N - 2);
@param $n 代表要获取斐波那契数列上第N个位置的数值
function fs1($n){ #求$n = 1 和 $n = 2的长度的数列位置永远都是1 if($n == 1 || $n == 2)return 1; $res[0] = 1; $res[1] = 1; for($i = 2; $i < $n; $i++){ $res[$i] = $res[$i - 1] + $res[$i - 2]; } return array_pop($res); }
递归算法-解决斐波那契数列
@param $n 代表要获取斐波那契数列上第N个位置的数值
function fs2($n){ #求$n = 1 和 $n = 2的长度的数列位置永远都是1 if($n == 1 || $n == 2) return 1; #形成一个二叉树结构 return fs2($n - 1) + fs2($n - 2); }
冒泡排序
function bubbleSort(&$arr){ for($i = 0,$len = count($arr); $i < $len; $i++){ #当第一次筛选的时候可以找到最大的数 #那么就不需要再判断最后一位的大小所以 - $i for($j = 0; $j < len - 1 - $i; $j++){ if($arr[$j] > $arr[$j + 1]){ $temp = $arr[$j + 1]; $arr[$j + 1] = $arr[$j]; $arr[$j] = $temp; } } } }
选择排序
先在数组中找到最小的一个然后和第一个元素调换位置
然后在找到第二小的和第二个元素调调换位置 以此类推
function selectSort(&$arr){ for($i = 0,$len = count($arr); $i < $len; $i++){ $min = $i; for($j = $i + 1; $j < $len - 1; $j++){ if($arr[$min] > $arr[$j]){ $min = $j; } } if($min != $i){ $temp = $arr[$i]; $arr[$i] = $arr[$min]; $arr[$min] = $temp; } } }
插入排序
找到要插入的位置,并将要插入位置后的元素向后移动一位
function insertSort(&$arr){ for($i = 1,$len = count($arr); $i < $len; $i++){ $temp = $arr[$i]; for($j = $i - 1; $j >= 0; $j--){ if($arr[$j] > $temp){ $arr[$j + 1] = $arr[$j]; $arr[$j] = $temp; }else{ break; } } } }
快速排序
通过中间值进行拆分,最后在组合起来
function quickSort($arr){ $len = count($arr); if($len <= 1) return $arr; $left = $right = array(); for($i = 1; $i < $len; $i++){ if($arr[$i] < $arr[0]){ $left[] = $arr[$i]; }else{ $right[] = $arr[$i]; } } $left = quickSort($left); $right = quickSort($right); return array_merge($left,(array)$arr[0],$right); }
归并排序
将数组进行拆分,后再排序,再合并
function mergeSort($arr){ $len = count($arr); if($len <= 1) return $arr; $middle = floor($len / 2); $left = array_slice($arr,0,$middle); $right = array_slice($arr,$middle); $left = mergeSort($left); $right = mergeSort($right); $res = array(); while(count($left) && count($right)){ $res[] = $left[0] < $right[0] ? array_shift($left) : array_shift($right); } return array_merge($res,$left,$right); }
顺序查找
遍历数组然后判断即可
function orderSearch($arr,$target){ for($i = 0,$len = count($arr); $i <= $len; $i++){ if($arr[$i] == $target){ return $arr[$i]; } } return false; }
二分查找法
将数组进行范围拆分,直到找到目标为止
function binarySearch($arr,$target){ $lborder = 0; $rborder = count($arr); while($lborder <= $rborder){ $middle = floor(($lborder + $rborder) / 2); if($arr[$middle] == $target){ return $middle + 1; }else if($arr[$middle] < $target){ $lborder = $middle + 1; }else { $rborder = $middle - 1; } } return false; }