本文实例总结了PHP经典算法。分享给大家供大家参考,具体如下:
1、首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半。
思路:多少行for一次,然后在里面空格和星号for一次。
for ($i=0; $i <= 3; $i++) { echo str_repeat("+", 3-$i); echo str_repeat("*", $i*2+1);//1357 echo '<br>'; }
2、冒泡排序,C里基础算法,从小到大对一组数排序。
思路:这题从小到大,第一轮排最小,第二轮排第二小,第三轮排第三小,依次类推……
$arr = array(756,3,5,32,1,2,6); $len = count($arr); for ($i=0; $i < $len-1; $i++) { for ($j=$i+1; $j < $len; $j++) { if($arr[$i]>$arr[$j]){ $p = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $p; } } } print_r($arr);
3、杨辉三角,用PHP写。
思路:每一行的第一位和最后一位是1,没有变化,中间是前排一位与左边一排的和,这种算法是用一个二维数组保存,另外有种算法用一维数组也可以实现,一行 一行的输出,有兴趣去写着玩下。
for ($i=0; $i < 6; $i++) { $a[$i][0]=1; $a[$i][$i]=1; } for ($i=2; $i < 6; $i++) { for ($j=1; $j < $i; $j++) { $a[$i][$j]=$a[$i-1][$j-1]+$a[$i-1][$j]; } } for ($i=0; $i < 6; $i++) { for ($j=0; $j <= $i; $j++) { echo $a[$i][$j].' '; } echo "<br>"; }
4、在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式。
思路:找到比要插入数大的那个位置,替换,然后把后面的数后移一位。
$in = 2; $arr = array(1,1,1,3,5,7); $n = count($arr); $t2 = " "; if($arr[$n-1]<$in){ $arr[$n+1] = $in; print_r($arr); }else{ for ($i=0; $i < $n; $i++) { if($arr[$i]>=$in){ $t1 = $arr[$i]; $arr[$i] = $in; for ($j=$i+1; $j < $n+1; $j++) { //最后一个$arr[$j]是空的,可以直接屏蔽掉,或者和我这样加个判断 if(isset($arr[$j])){ $t2 = $arr[$j]; $arr[$j] = $t1; $t1 = $t2; }else{ $arr[$j] = $t1; } } print_r($arr); break; } } }
5、对一组数进行排序(快速排序算法)。
思路:通过一趟排序分成两部分,然后递归对这两部分排序,最后合并。
function q($array){ if(count($array)<= 1){return $array;} $key = $array[0]; $l = array(); $r = array(); for ($i=1; $i < count($array); $i++) { if ($array[$i] <= $key) { $l[] = $array[$i]; }else{ $r[] = $array[$i]; } } $l = q($l); $r = q($r); return array_merge($l, array($key), $r); } $arr = array(100,2,44,3,4,33); print_r( q($arr) );
6、在一个数组查找你所需元素(二分查找算法)。
思路:以数组中某个值为界,再递归进行查找,直到结束。
function find($array, $low, $high, $k){ //有缺陷 if($low <= $high ){ $mid = intval( ($low+$high)/2 ); if($array[$mid] == $k){ return '查找到'.$array[$mid].", 在数值中的第".$mid."位"; }elseif($k < $array[$mid] ){ return find($array, $low, $mid-1, $k); }else{ return find($array, $mid+1, $high, $k); } } die('not have...'); } $array = array(3,4,5,6); $n = count($array); $r = find($array,0,$n,5); print_r($r);
7、合并多个数组,不用array_merge(),题目来于论坛。
思路:遍历每个数组,重新组成一个新数组。
function t(){ $c = func_num_args()-1; $a = func_get_args(); //print_r($a); for ($i=0; $i <= $c; $i++) { if (is_array($a[$i]) ) { for($j = 0; $j< count($a[$i]); $j++ ){ $r[] = $a[$i][$j]; } }else{ break('not a array!'); } } return $r; } print_r( t(range(1, 4),range(1, 4),range(1, 4)) ); echo "<br>"; //使用array_merge函数 $a = array_merge(range(1, 4),range(1, 4),range(1, 4)); print_r($a);
8、牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。(来自论坛)
function y($n){ static $num = 1; for ($j=1; $j <= $n; $j++) { if($j>=4 && $j<15){$num++;y($n-$j);} if($j == 20){ $num--;} } return $num ; } echo y(21);
冒泡排序:两两交换数值,最小的值在最左边,就如最轻的气泡在最上边。对整列数两两交换一次,最小的数在最左边,每次都能得一个在剩下的数中的最小 的数,“冒”出来的数组成一个有序区间,剩下的值组成一无序区间,且有序区间中每一元素值都比无序区间的小。
快速排序:基准数,左右二个数组,递归调用,合并。
插入排序:排序区间分成二部分,左边有序,右边无序,从右区间取 第一个元素插入左区间,若此元素比左边区间最右边的元素大,留在原处,若此元素比左 边区间最右边的元素小,则插在最右边元素的原位置,同时最右边元素右移一位,计算器减一,重新和前面的元素比较,直到前面的元素比要插入元素小为止,重复 上述步骤。
注意区间端点值的处理,及数组的第一个元素下标为0.
更多算法可以点击链接了解 点我
如果有错误或别的问题欢迎联系我,感谢
邮箱:tlilam@163.com
QQ:739682648
微信号:Tlilam