phpの一般的なアルゴリズム実装


<?php
$arr = array(35,66,2,15,6,81,6,9,0,-2,9); 
    /*    :    ( )     ,     ,           、   。 
         :http://www.cnblogs.com/zemliu/archive/2012/08/18/2645941.html 
    */ 
     function heapSort(&$arr) { 
         #              ,                 
         initHeap($arr, 0, count($arr) - 1); 
         //print_r($arr);exit; 
         #        ,               ,         
         for($end = count($arr) - 1; $end > 0; $end--) {  //                   ,     ,  
         //          
             $temp = $arr[0]; 
             $arr[0] = $arr[$end]; 
             $arr[$end] = $temp; 
             ajustNodes($arr, 0, $end - 1); 
         } 
     } 
      
     #      ,            ,                 /2      
     function initHeap(&$arr) { 
         $len = count($arr); 
         for($start = floor($len / 2) - 1; $start >= 0; $start--) { 
             ajustNodes($arr, $start, $len - 1); 
         } 
     } 
      
     #     
     #@param $arr          
     #@param $start             
     #@param $end                
     function ajustNodes(&$arr, $start, $end) { 
         $maxInx = $start; //     
         $len = $end + 1;    #        
         $leftChildInx = ($start + 1) * 2 - 1;    #      
         $rightChildInx = ($start + 1) * 2;    #      
          
         #           ,         ,         
         if($leftChildInx + 1 <= $len) { 
             #         
             if($arr[$maxInx] < $arr[$leftChildInx]) { 
                 $maxInx = $leftChildInx; 
             } 
         } 
         #             ,       ,            ,         
         if($rightChildInx + 1 <= $len) { 
             if($arr[$maxInx] < $arr[$rightChildInx]) { 
                 $maxInx = $rightChildInx; 
             } 
         } 
         //        , 、 、      ,           maxInx       。 
         #           
         if($start != $maxInx) { 
             //               
             $temp = $arr[$start]; 
             $arr[$start] = $arr[$maxInx]; 
             $arr[$maxInx] = $temp; 
              
             #              ,     
             if(($maxInx + 1) * 2 <= $len) {//      
                 ajustNodes($arr, $maxInx, $end); 
             } 
         } 
     } 
      
     $arr = array(35,66,2,15,6,81,6,9); 
     heapSort($arr); 
     print_r($arr); 
/* 
    :                 ( )     。               
       。   :       ,            ,            , 
    。 
*/ 
function count_sort($ary) { 
    $tmp = array(); 
    for($i = 0;$i< count($ary);$i++) { //   ,        
        if($max < $ary[$i]) { 
            $max = $ary[$i]; 
        } 
    } 
    for($i = 0;$i < $max;$i++) { 
        $tmp[$i] = 0; 
    } 
    for($i = 0;$i < count($ary);$i++) { 
        $tmp[$ary[$i]]++; 
    } 
     
    for ($i = 1; $i < count($tmp); $i++) { 
        $tmp[$i] += $tmp[$i-1]; 
    } 
    //print_r($tmp); 
    for ($i = 0; $i < count($ary); $i++) { 
        $tmp_ary[$tmp[$ary[$i]]] = $ary[$i]; 
        $tmp[$ary[$i]]--; 
    } 
     
    for ($i = 0; $i < count($tmp_ary); $i++) { 
        $ret[] = $tmp_ary[$i]; 
    } 
    return $ret; 
} 
$arr = array(35,66,2,15,6,81,6,44); 
print_r(count_sort($arr)); 

/* 
    :      ,      [        ]             , 
          。                          。 
       ,            、        ,            。
       :         ,    。  ,                   ,
                     。
*/ 
function quick_sort($ary) { 
    if(count($ary) > 1) { 
        $left = array(); 
        $right = array(); 
        $pivot = $ary[0]; 
        for($i = 1;$i< count($ary);$i++) { 
            if($ary[$i] >= $pivot) $right[] = $ary[$i]; 
            else $left[] = $ary[$i]; 
        } 
         
        $left = quick_sort($left); 
        $right = quick_sort($right); 
        return array_merge($left,array($pivot),$right); 
    } else { 
        return $ary; 
    } 
} 
$arr = array(35,66,2,15,6,81,6,9); 
$sort_ary = quick_sort($ary); 
print_r($sort_ary); 
/* 
         。*/ 
function partition(&$ary,$low,$high) { 
    $tmp = $ary[$low]; 
    while($low < $high) { 
        while($low < $high && $ary[$high] >= $tmp) {  
            $high--; 
        } 
        $ary[$low] = $ary[$high];//     :          ,   low        
        while($low < $high && $ary[$low] <= $tmp) { 
            $low++; 
        } 
        $ary[$high] = $ary[$low];//          ,   high        ,    ,     
        //                。 
    } 
    $ary[$low] = $tmp;//   ,        low  ,   low              ,    ,     
    return $low; 
} 


function quick_sort2(&$ary,$low,$high) { 
    if($low < $high) { 
        $p = partition($ary,$low,$high); 
        quick_sort($ary,$low,$p - 1); 
        quick_sort($ary,$p+1,$high); 
    } 
    return $ary; 
} 
$arr = array(35,66,2,15,6,81,6,9); 
$sort_ary = quick_sort2($ary,0,count($ary)); 
print_r($sort_ary); 

/* 
/*       */ 
function cr_sort1($ary) { 
    for($i = 1;$i < count($ary);$i++) { 
        $tmp = $ary[$i]; 
        $j = $i - 1;     
        while($j>=0 && $ary[$j] > $tmp) { 
            $ary[$j + 1] = $ary[$j]; 
            $j--; 
        } 
        $ary[$j+1] = $tmp; 
    } 
    return $ary; 
} 

//           
function cr_sort2($ary) { 
    for($i=1;$i < count($ary);$i++) { 
        $tmp = $ary[$i]; 
        $j = $i; 
        while($j >= 0 && $tmp < $ary[$j-1]) { 
            $ary[$j] = $ary[$j-1];//     
            $j--; 
        } 
        $ary[$j] = $tmp;//    
    } 
    return $ary; 
} 
/*    :                                     , 
         。                   ,           。 
     :      ,                          。        。 
*/ 
function cr_sort3($ary) { 
    for($i = 1;$i < count($ary);$i++) { 
        $tmp = $ary[$i]; 
        $j = $i - 1; 
        $low = 0; 
        $high = $i - 1; 
        while($low <= $high) { 
            $mid = floor(($low + $high) / 2); 
            if($tmp > $ary[$mid]) $low = $mid + 1; 
            else  $high = $mid - 1; 
        } 
         
        while($j >= $low) { 
            $ary[$j + 1] = $ary[$j]; 
            $j--; 
        } 
        $ary[$low] = $tmp; 
    } 
    return $ary; 
} 
/* 
    :         。                    。 
     :      ,“  ”              。        。 

*/ 
function shell_sort($ary) { 
    $d = count($ary); 
    while($d  > 1) { 
        $d  = intval($d / 2); //   
        for($i = $d;$i < count($ary);$i+=$d) { 
            $tmp = $ary[$i]; 
            $j = $i - $d;     
            while($j >= 0 && $ary[$j] > $tmp) { 
                $ary[$j + $d] = $ary[$j]; 
                $j -= $d; 
            } 
            $ary[$j+$d] = $tmp; 
        } 
    } 
    return $ary; 
} 

//     :             、      
function xz_sort(&$ary) { 
    for($i = 0;$i < count($ary);$i++) { 
        $tmp = $ary[$i]; 
        for($j = $i+1;$j < count($ary);$j++) { 
            if($ary[$i] > $ary[$j]) { 
                $sit = $j; 
                $ary[$i] = $ary[$j]; 
            } 
        } 
        if($tmp != $ary[$i]) { 
            $ary[$sit] = $tmp; 
        } 
        //$ary[$i] = $flag; 
    } 
    return $ary; 
} 




$ary = array(23,-2,9,0,89,100,-23); 
$ary = cr_sort1($ary); 
print_r($ary); 
//   :          ,    ,        ( )         、   、、、 
//        :         ,             、        。 
//    :      。 

function mp_sort2(&$ary) { 
    for($i = 0;$i < count($ary);$i++) { 
        for($j = 0;$j < count($ary) - $i - 1;$j++) { 
            if($ary[$j] > $ary[$j+1]) { 
                $tmp = $ary[$j]; 
                $ary[$j] = $ary[$j+1]; 
                $ary[$j+1] = $tmp; 
            } 
             
        } 
    } 
    return $ary; 
} 

function mp_sort(&$ary) { 
    for($i = 0;$i < count($ary);$i++) { 
        for($j = count($ary)-2;$j >= $i;$j--) { 
            if($ary[$j] > $ary[$j+1]) { 
                $tmp = $ary[$j]; 
                $ary[$j] = $ary[$j+1]; 
                $ary[$j+1] = $tmp; 
            } 
        } 
    } 
    return $ary; 
} 

//            
function div_search($ary,$key) { 
    $low = 0; 
    $high = count($ary) - 1; 
    $i = 0; 
    while($low <= $high) { 
        $mid = floor(($high+$low)/2); 
        if($key == $ary[$mid]) return $key; 
        elseif($key < $ary[$mid]) $high = $mid -1;//     ,          
        else $low = $mid + 1; 
    } 
} 
//           
function re_div_search($ary,$key,$low,$high) { 
    $mid = floor(($high+$low)/2); 
    if($key == $ary[$mid]) return $key; 
    elseif($key < $ary[$mid]) return re_div_search($ary,$key,$low,$mid -1); 
    else return re_div_search($ary,$key,$mid + 1,$high); 
} 
//        
function find_str($str,$substr) { 
    $i = 0; 
    $j =0 ; 
    while($i<strlen($str) && $j<strlen($substr)) { 
        if($str[$i]==$substr[$j]) { 
            $i++; 
            $j++; 
        } else { 
            $i = $i - $j +1; //        ,i       ! 
            $j = 0; 
        } 
    } 
    if($j == strlen($substr)) return true; 
    return false; 
} 

$str = 'XXXhello world'; 
$substr = 'ld'; 
echo find_str($str,$substr); 
exit; 

//        
function findN($n) { 
    if($n <= 2) return 1; 
    return findN($n-2)+findN($n-1); 
} 
//              
function findN1($n) { 
    $arr = array(1,1); 
    if($arr <= 2) return $arr; 
    for($i = 2;$i < $n;$i++) { 
        $arr[] = $arr[$i-1] + $arr[$i-2] ; 
    } 
    return implode(',',$arr); 
} 
print_r(findN1(7));exit; 
for($i = 1;$i<=20;$i++) { 
    echo findN($i); 
    echo '<br>'; 
} 
exit; 


//$ary = array(100,1,10,10,2,8,890,4,-98,39,89,12,-2); 

//$ary = mp_sort($ary); 

//print_r($ary);