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
- php常用算法总结
- PHP常用算法
- PHP常用算法
- php常用排序算法
- php常用算法整理
- PHP常用算法
- php常用算法
- php常用算法
- php 常用算法
- 常用算法PHP版
- php常用算法
- 七大常用PHP算法
- php常用算法
- PHP面试常用算法
- php常用算法
- PHP 常用算法
- php各种常用算法
- php常用排序算法
- Android系统中标准Intent的使用
- Activity 视图启动流程
- Oralce客户端Pl sql deveploer 连接oracle后表数据及注释乱码
- 万网杠杠的价,杠杠的量
- Jquery toggle()方法的使用
- php常用算法
- PHP生成唯一订单号
- UIButton使用汇总
- HBase性能调优
- 浏览器的“刷新”&“缓存机制”
- 菜鸟的安卓实习之路----Android多语言切换
- How to Use Google AdSense Ads on Responsive Websites
- jquery1.8及以下版本toggle使用
- 关于“C2989:类模板已经声明为非类模板”出错