php算法 php算法

php算法

 
  1. 一、首先來畫個菱形玩玩,不少人學C時在書上都畫過,我們用PHP畫下,畫了一半。

思路:多少行for一次,而後在裏面空格和星號for一次。php

1
2
3
4
5
6
<?php
for ( $i =0; $i <=3; $i ++){
   echo  str_repeat ( " " ,3- $i );
   echo  str_repeat ( "*" , $i *2+1);
   echo  '<br/>' ;
}

二、冒泡排序,C裏基礎算法,從小到大對一組數排序。html

思路:這題從小到大,第一輪排最小,第二輪排第二小,第三輪排第三小,依次類推……算法

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$arr  = array (1,3,5,32,756,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 ;
     }
   }
}
var_dump( $arr );

三、楊輝三角,用PHP寫。shell

思路:每一行的第一位和最後一位是1,沒有變化,中間是前排一位與左邊一排的和,這種算法是用一個二維數組保存,另外有種算法用一維數組也能夠實現,一行 一行的輸出,有興趣去寫着玩下。數組

1
1   1
1   2   1
1   3   3   1
1   4   6   4   1
1   5  10  10   5   1工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
//每行的第一個和最後一個都爲1,寫了6行
  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/>' ;
  }

四、在一組數中,要求插入一個數,按其原來順序插入,維護原來排序方式。post

思路:找到比要插入數大的那個位置,替換,而後把後面的數後移一位。測試

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$in  = 2;
$arr  = array (1,1,1,3,5,7);
$n  = count ( $arr );
//若是要插入的數已經最大,直接打印
if ( $arr [ $n -1] < $in ) {
   $arr [ $n +1] = $in ; print_r( $arr );
   }
for ( $i =0; $i < $n ; $i ++) {
//找出要插入的位置
   if ( $arr [ $i ] >= $in ){
     $t1 = $arr [ $i ];
     $arr [ $i ] = $in ;
//把後面的數據後移一位
     for ( $j = $i +1; $j < $n +1; $j ++) {
       $t2  = $arr [ $j ];
       $arr [ $j ] = $t1 ;
       $t1  = $t2 ;
   }
//打印
   print_r( $arr );
   die ;
   }
}

五、對一組數進行排序(快速排序算法)。ui

思路:經過一趟排序分紅兩部分,而後遞歸對這兩部分排序,最後合併。url

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function  q( $array ) {
   if  ( count ( $array ) <= 1) { return  $array ;}
//以$key爲界,分紅兩個子數組
   $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 (1,2,44,3,4,33);
print_r( q( $arr ) );

六、在一個數組查找你所需元素(二分查找算法)。

思路:以數組中某個值爲界,再遞歸進行查找,直到結束。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function  find( $array , $low , $high , $k ){
   if  ( $low  <= $high ){
   $mid  = intval (( $low + $high )/2);
     if  ( $array [ $mid ] == $k ){
     return  $mid ;
   } elseif  ( $k  < $array [ $mid ]){
     return  find( $array , $low , $mid -1, $k );
     } else {
     return  find( $array , $mid +1, $high , $k );
     }
   }
   die ( 'Not have...' );
}
//test
$array  = array (2,4,3,5);
$n  = count ( $array );
$r  = find( $array ,0, $n ,5)

七、合併多個數組,不用array_merge(),題目來於論壇。

思路:遍歷每一個數組,從新組成一個新數組。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
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  {
       die ( 'Not a array!' );
     }
   }
   return  $r ;
}
//test
print_r(t(range(1,4),range(1,4),range(1,4)));
echo  '<br/>' ;
$a  = array_merge (range(1,4),range(1,4),range(1,4));
print_r( $a );

八、牛年求牛:有一母牛,到4歲可生育,每一年一頭,所生均是同樣的母牛,到15歲絕育,再也不能生,20歲死亡,問n年後有多少頭牛。(來自論壇)

1
2
3
4
5
6
7
8
9
10
11
<?php
function  t( $n ) {
     static  $num  = 1
     for ( $j =1; $j <= $n ; $j ++){
         if ( $j >=4 && $j <15) { $num ++;t( $n - $j );}
         if ( $j ==20){ $num --;}
      }
      return  $num ;
}
//test
echo  t(8);

====================其餘算法=========================

冒泡排序 (bubble sort) — O(n2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$data  = array (3,5,9,32,2,1,2,1,8,5);
dump( $data );
BubbleSort( $data );
dump( $data );
function  BubbleSort(& $arr )
{
$limit  = count ( $arr );
for ( $i =1; $i < $limit ; $i ++)
{
   for ( $p = $limit -1; $p >= $i ; $p --)
   {
   if ( $arr [ $p -1] > $arr [ $p ])
   {
    $temp  = $arr [ $p -1];
    $arr [ $p -1] = $arr [ $p ];
    $arr [ $p ] = $temp ;
   }
   }
}
}
function  dump( $d  )
{
echo  '<pre>' ;
print_r( $d );
echo  '</pre>' ;
}

插入排序   (insertion sort)— O(n2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$data  = array (6,13,21,99,18,2,25,33,19,84);
$nums  = count ( $data )-1;
dump( $data  );
InsertionSort( $data ,
相關文章
相關標籤/搜索