今天有点时间,回顾一下PHP的基本算法,好久没写了,今天复习一下,免得忘记了!!!
冒泡排序
相邻两个元素比较,小于(或大于)则交换两个元素的位置,直到走完所有的元素。
时间复杂度O(N^2)
/**
* @param $arr
* @return mixed
* 冒泡排序
*/
function MaopaoSort($arr){
// $arr = ['9','1','0'];
for ($i = 0;$i<count($arr);$i++){
for($j = 0;$j<count($arr)-$i-1;$j++){
if($arr[$j]>$arr[$j+1]){
swap($arr[$j],$arr[$j+1]);
}
}
}
return $arr;
}
function swap(&$a,&$b){
$temp = $a;
$a = $b;
$b = $temp;
}
快速排序:
在数组中挑出一个元素(多为第一个)作为基本值,扫描一遍数组将比基本值小的元素排在基本值左边,将所有比基本值大的元素排在基本值之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致,最后将数组合并起来。记得将基本值加在左边数组与右边数组之间。
/**
* @param $arr
* @return array
* 快速排序
*/
function QuickSort($arr){
if(count($arr)<=1){
return $arr;
}
$tmp = $arr[0];
$left = array(); // 小于中间值
$right = array();// 大于中间值
for($i=1;$i<count($arr);$i++){
if($arr[$i]<$tmp){
$left[] = $arr[$i];
}else{
$right[] = $arr[$i];
}
}
$left = QuickSort($left);
$right = QuickSort($right);
return array_merge($left,array($tmp),$right);
}
二分查找
对于给定值val,从序列的中间位置开始比较,如果当前位置值等于val,则查找成功;若val小于当前位置值,则在数列的前半段中查找;若val大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)
/**
* @param $arr
* 二分查找
* $low 最小位置
* $high 最大位置
* $val 目标值
* $arr 目标数组
*/
function BinSearch($low,$high,$val,$arr){
if ( $low <= $high){
$mid = intval(($low+$high)/2 );
if ($arr[$mid] == $val){
return $mid;
}elseif ( $val < $arr[$mid]){
return BinSearch($arr, $low, $mid-1, $val);
}else{
return BinSearch($arr, $mid+ 1, $high, $val);
}
}
return -1;
}