php常用算法

来源:互联网 发布:淘宝怎样设置原价现价 编辑:程序博客网 时间:2024/06/07 00:27
<?php//插入排序$arr = array(123, 0, 1111,5, -1, 4, 15);function insertSort(&$arr) {$m = count($arr);for($i=1;$i<$m;$i++){$inseartValue = $arr[$i];$index = $i-1;//如果没找到插入未知while ($index>=0 && $inseartValue<$arr[$index]) {$arr[$index+1] = $arr[$index];$index -- ;}//找到插入位置;$arr[$index+1] = $inseartValue;}}insertSort($arr);//print_r($arr);######################################################/** * 二分查找 */ function binarySerch($arr,$left,$right,$v){ $mid = floor($left+$right)/2;if($left<=$right){if($arr[$mid] == $v){return $mid;}if($arr[$mid]>$v){//在左边return binarySerch($arr, $left, $mid-1, $v);}else{//在右边return binarySerch($arr, $mid+1, $right, $v);}}return -1; } $arr = array(1,5,8,10,11,100);$i = binarySerch($arr, 0, count($arr)-1, 1000);//echo $i;##############################################################################/** * 快速排序 */ function quickSort($arr){ if(count($arr)<=1) return $arr;$reference = $arr[0];$leftArr = array();$rigthArr = array();for($i=1;$i<count($arr);$i++){if($arr[$i]<=$reference){$leftArr[] = $arr[$i];}else{$rigthArr[] = $arr[$i];}}$leftArr = quickSort($leftArr);$rigthArr = quickSort($rigthArr);return array_merge($leftArr,array($reference),$rigthArr); }$arr = array(123, 0, 1111,5, -1, 4, 15);$a = quickSort($arr);#######print_r($a); ########################################################################/* * 冒泡排序 */ function pupSort(&$arr){ $m = count($arr);for ($i=0; $i <$m; $i++) { for ($j=0; $j <$m-$i-1; $j++) { if($arr[$j]>$arr[$j+1]){list($arr[$j],$arr[$j+1]) = array($arr[$j+1],$arr[$j]);}}} }$arr = array(123, 0, 1111,5, -1, 4, 15);$a = pupSort($arr);//print_r($arr); #################################################/** * 希尔排序 * 时间复杂度为O(n3/2) */function shellSort(&$arr){$n = count($arr);//设置步长为每次元素的一半长度for ($gap=floor($n/2); $gap >0 ; $gap=floor($gap/2)) { //对步长的元素进行插入排序for($i=$gap;$i<$n;$i++){$v = $arr[$i];$k = $i-1;//寻找插入位置;while ($k>=0 && $v<$arr[$k]) {$arr[$k+1] = $arr[$k];$k--;}$arr[$k+1] = $v;}}}$arr = array(123, 0, 1111,5, -1, 1, 15);$a = shellSort($arr);//print_r($arr); ##################################################################### /** * 计数排序/桶子排序 */function radixSort($arr,$p=1){$radix = 0;$temp = array();for($i=0;$i<count($arr);$i++){$radix = max($radix,strlen($arr[$i]));$index = strlen($arr[$i])>=$p ? substr($arr[$i],-$p,1) : 0;$temp[$index][] = $arr[$i];}//数组重新转换$tp = array();for ($i=0; $i <10 ; $i++) {if(isset($temp[$i])){foreach($temp[$i] as  $value) {$tp[] = $value;}}}return $p <= $radix ? radixSort($tp,$p+1) : $tp;}$arr = array(123, 0, 1111,5, 1, 15);$p = radixSort($arr);//print_r($p);###################################################################################/** * 堆排序 * 时间复杂度 Olog(n) */ //建堆 function build_heap(&$array,$i,$heapsize){        $left = $i*2+1;        $right = $left + 1;        $max = $i;        if($i < $heapsize && $left<$heapsize  && $array[$left] > $array[$i] ){                $max = $left;        }        if($i < $heapsize && $right<$heapsize && $array[$right] > $array[$max]){                $max = $right;        }        if($i != $max && $i < $heapsize && $max < $heapsize){                list($array[$i],$array[$max])=array($array[$max],$array[$i]);                build_heap($array,$max,$heapsize);        }}function sortHeap(&$array,$heapsize){        while($heapsize){                list($array[0],$array[$heapsize-1])=array($array[$heapsize-1],$array[0]);                $heapsize = $heapsize -1;                build_heap($array,0,$heapsize);        }}function createHeap(&$array,$heapsize){        $i = ceil($heapsize/2)-1;        for(;$i>=0;$i--){                build_heap($array,$i,$heapsize);        }}function heapSort(&$array){        $heapsize = count($array);        createHeap($array,$heapsize);        sortHeap($array,$heapsize);} $arr = array(123, 0, 1111,5, 1, 15,29);heapSort($arr);//print_r($arr);###############################################################################/** * 归并排序 * 时间复杂度 Θ(nlgn); */  #### 合并排序 function merge(&$arr,$start,$mid,$end){ $i = $start;$j = $mid+1;$k=0; $ary = array();while ($i <= $mid && $j<=$end){if($arr[$i]<=$arr[$j]){$ary[$k++] = $arr[$i++];}else{$ary[$k++] = $arr[$j++];}}while($i <= $mid) {           $ary[$k++] = $arr[$i++];   }   while($j <= $end) {          $ary[$k++] = $arr[$j++];   }for($i = 0 ;$i < $k;$i++){   $arr[$i + $start] = $ary[$i];   }}//分成n个片段function mergeSort(&$array,$low,$high) {       if($low < $high) { // 任何递归都要有边界,否则就是死循环              $mid = floor(($low+$high)/ 2);              mergeSort($array,$low,$mid);              mergeSort($array,$mid+1,$high);              merge($array,$low,$mid,$high);       } else {              return ;// 这里其实可以不写,php内部默认都会自动加return的       }}$arr = array(123, 0, 1111,5, 1, 15,29);mergeSort($arr,0,6);//print_r($arr);  #############################################################//矩阵求最长公共子串function sub_string($str1,$str2){   $max = 0; //字符串最大长度   $current = 0;  //记录str1的当前位置.   $str1_len = strlen($str1);   $str2_len = strlen($str2);   $arr = array();   //初始化矩阵   for($i =0;$i <$str1_len;$i++)     for($j =0; $j< $str2_len;$j++)       $arr[$i][$j] = 0;   //找出最大公约子串   for($i = 0; $i < $str1_len; $i++)     for($j = 0; $j < $str2_len; $j++)       {          if($str1[$i] == $str2[$j])               {                   if ($i ==0 ||$j ==0)                       $arr[$i][$j]=1;                   else //在矩阵中记录,得到最长的斜线就是最大的公约子串.                    $arr[$i][$j] = $arr[$i-1][$j-1]+1;                     if($max < $arr[$i][$j])                      {                        $max = $arr[$i][$j];                        $current = $i;                      }               }       }    if($max  == 0)      return false;   else   //$current+1-$max,找到最长公约字符串的开始位置     return substr($str1,$current+1-$max,$current);}$str1 = "abcsdf";$str2 = "bbcsggg";$sub_str = sub_string($str1,$str2);if( $sub_str != false)    echo $sub_str;?>

0 0
原创粉丝点击