算法之php版
列出可能会用到的几个算法
<?php
/**
* @desc 打印出一个菱形
*/
function diamond($n)
{
for($i=0; $i<=$n; $i++)
{
for($j=0; $j<=$n-$i; $j++)
{
echo " ";
}
for($k=0; $k<=2*$i; $k++)
{
echo "*";
}
echo "<br/>";
}
for($i=$n; $i>=0; $i--)
{
if($i==$n){continue;}
for($j=0; $j<=$n-$i; $j++)
{
echo " ";
}
for($k=0; $k<=2*$i; $k++)
{
echo "*";
}
echo "<br/>";
}
}
diamond(3);
/**
* @desc 冒泡排序
*/
function bubbleSort($arr)
{
$len = count($arr);
for($i=0; $i<$len-1 ; $i++)
{
for($k=$i; $k<$len-1; $k++)
{
if($arr[$i] < $arr[$k+1])
{
$tmp = $arr[$i];
$arr[$i] = $arr[$k+1];
$arr[$k+1] = $tmp;
}
}
}
return $arr;
}
$arr = array(9,2,7,4,8,5,6);
bubbleSort($arr);
/**
* @desc 杨辉三角
*/
function yangHui($n)
{
$arr = array();
for($i=0; $i<$n; $i++)
{
//所有列的第一个
$arr[$i][0] = 1;
//所有列的最后一个
$arr[$i][$i] = 1;
}
//第一行、第二行已经求出,所以从第三行开始
for($i=2; $i<$n; $i++)
{
for($j=1; $j<$i; $j++)
{
//第i行,第j个的值 。等于 第i-1行的 第j 个值 加上 第i-1行的第j-1个的值,
$arr[$i][$j] = $arr[$i-1][$j-1] + $arr[$i-1][$j];
}
}
//打印结果
//第一行、第二行已经求出,所以从第三行开始
for($i=0; $i<$n; $i++)
{
for($j=0; $j<=$i; $j++)
{
echo $arr[$i][$j]." ";
}
echo "<br/>" ;
}
}
yangHui(10);
/**
* @desc 顺序插入 在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式。
*/
function orderInsert($arr, $int)
{
$len = count($arr);
if($int > $arr[$len-1] )
{
$arr[$len] = $int;
return $arr;
}
for($i=0; $i<$len; $i++)
{
if($arr[$i] > $int)
{
$t1 = $arr[$i];
$arr[$i] = $int;
for($j=$i+1; $j<$len+1; $j++)
{
@$t2 = $arr[$j];
$arr[$j] = $t1;
$t1 = $t2;
}
return $arr;
}
}
}
$arr = array(1,3,6,8,9);
$int = 5;
print_r(orderInsert($arr, $int));
/**
* @desc 二分查找
*/
function binarySearch($arr, $need, $low, $height)
{
static $i=0;
static $process = array();
$i++;
if($height >= $low)
{
$mid = ceil(($low + $height)/2);
array_push($process, $mid);
if($arr[$mid] == $need)
{
//运行结果的下标 , 运行 次数 ,运行过程中的 $min
return array("result"=>$mid, "times"=>$i, "process" =>$process);
}
elseif($arr[$mid] < $need)
{
return binarySearch($arr, $need, $mid+1, $height);
}else
{
return binarySearch($arr, $need, $low, $mid-1);
}
}
}
$arr = range(1, 1234);
$need = 999;
$keys = array_keys($arr);
$low = min($arr);
$high = max($arr);
$i=0;
$result = binarySearch($arr, $need, $low, $high);
echo "<hr/>";
var_dump($result);
//合并数组
function merge()
{
$num = func_num_args();
$args = func_get_args();
$arr = array();
for($i=0; $i<$num; $i++)
{
if(is_array($args[$i]))
{
$len = count($args[$i]);
for($j=0; $j<$len; $j++)
{
if(!in_array($args[$i][$j], $arr))
{
array_push($arr, $args[$i][$j]);
}
}
}
else
{
die("第个参数不是数组");
}
}
return $arr;
}
echo "<hr/>";
var_dump(merge(range(1,8), range(6,10), range(10,15)));
var_dump(array_merge(range(1,8), range(6,10), range(10,15)));
//牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛
function t($n)
{
static $num = 1;
for($i=0; $i<=$n; $i++)
{
if($i>=4 && $i < 15)
{
$num++;
t($n-$i);
}
if($i==20)
{
$num--;
}
}
return $num;
}
?>