Blogger Information
Blog 39
fans 0
comment 2
visits 47209
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP经典算法
Tlilam的PHP之路
Original
917 people have browsed it

本文实例总结了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


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post