算法之php版

列出可能会用到的几个算法

<?php
/**
 * @desc 打印出一个菱形
 */
function diamond($n)
{
 for($i=0; $i<=$n; $i++)
 {
  for($j=0; $j<=$n-$i; $j++)
  {
   echo "&nbsp;";
  }
  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 "&nbsp;";
  }
  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]."&nbsp;";
  }
  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;
}

?>

原文地址:https://www.cnblogs.com/fengwei/p/2613281.html