PHP经典算法集锦【经典收藏】
php  /  管理员 发布于 7年前   133
本文实例总结了PHP经典算法。分享给大家供大家参考,具体如下: 1、首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半。 思路:多少行for一次,然后在里面空格和星号for一次。 2、冒泡排序,C里基础算法,从小到大对一组数排序。 思路:这题从小到大,第一轮排最小,第二轮排第二小,第三轮排第三小,依次类推…… 3、杨辉三角,用PHP写。 思路:每一行的第一位和最后一位是1,没有变化,中间是前排一位与左边一排的和,这种算法是用一个二维数组保存,另外有种算法用一维数组也可以实现,一行 一行的输出,有兴趣去写着玩下。 1 4、在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式。 思路:找到比要插入数大的那个位置,替换,然后把后面的数后移一位。 5、对一组数进行排序(快速排序算法)。 思路:通过一趟排序分成两部分,然后递归对这两部分排序,最后合并。 6、在一个数组查找你所需元素(二分查找算法)。 思路:以数组中某个值为界,再递归进行查找,直到结束。 7、合并多个数组,不用array_merge(),题目来于论坛。 思路:遍历每个数组,重新组成一个新数组。 8、牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。(来自论坛) ====================其他算法========================= 冒泡排序 (bubble sort) ― O(n2) 插入排序 (insertion sort)― O(n2) 希 尔排序 (shell sort)― O(n log n) 快 速排序 (quicksort)― O(n log n) ================================================= 冒泡排序:两两交换数值,最小的值在最左边,就如最轻的气泡在最上边。对整列数两两交换一次,最小的数在最左边,每次都能得一个在剩下的数中的最小 的数,“冒”出来的数组成一个有序区间,剩下的值组成一无序区间,且有序区间中每一元素值都比无序区间的小。 快速排序:基准数,左右二个数组,递归调用,合并。 插入排序:排序区间分成二部分,左边有序,右边无序,从右区间取 第一个元素插入左区间,若此元素比左边区间最右边的元素大,留在原处,若此元素比左 边区间最右边的元素小,则插在最右边元素的原位置,同时最右边元素右移一位,计算器减一,重新和前面的元素比较,直到前面的元素比要插入元素小为止,重复 上述步骤。 注意区间端点值的处理,及数组的第一个元素下标为0. ======================================= 更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php加密方法总结》、《PHP编码与转码操作技巧汇总》、《php面向对象程序设计入门教程》、《PHP数学运算技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php正则表达式用法总结》、及《php常见数据库操作技巧汇总》 希望本文所述对大家PHP程序设计有所帮助。';}
$arr[$j]){//从小到大 $p = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j]= $p; } }}var_dump($arr);
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1'; }
= $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; }}
';$a = array_merge(range(1,4),range(1,4),range(1,4));print_r($a);
=4 && $j<15) {$num++;t($n-$j);} if($j==20){$num--;} } return $num;}//testecho t(8);
$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 '
';print_r($d);echo '
';}$data = array(6,13,21,99,18,2,25,33,19,84);$nums = count($data)-1;dump( $data );InsertionSort($data,$nums);dump( $data );function InsertionSort(& $arr,$n ){for( $i=1; $i<=$n; $i++ ){ $tmp = $arr[$i]; for( $j = $i; $j>0 && $arr[$j-1]>$tmp; $j-- ) { $arr[$j] = $arr[$j-1]; } $arr[$j] = $tmp;}}function dump( $d ){echo '
';print_r($d);echo '
';}$data = array(6,13,21,99,18,2,25,33,19,84);$nums = count($data);dump( $data );ShellSort($data,$nums);dump( $data );function ShellSort(& $arr,$n ){for( $increment = intval($n/2); $increment > 0; $increment = intval($increment/2) ){ for( $i=$increment; $i<$n; $i++ ) { $tmp = $arr[$i]; for( $j = $i; $j>= $increment; $j -= $increment ) if( $tmp < $arr[ $j-$increment ] ) $arr[$j] = $arr[$j-$increment]; else break; $arr[$j] = $tmp; }}}function dump( $d ){echo '
';print_r($d);echo '
';}$data = array(6,13,21,99,18,2,25,33,19,84);dump($data);quicks($data,0,count($data)-1);dump($data);function dump( $data){echo '
';print_r($data);echo '
';}function QuickSort(& $arr,$left,$right){$l = $left;$r = $right;$pivot = intval(($r+$l)/2);$p = $arr[$pivot];do{ while(($arr[$l] < $p) && ($l < $right)) $l++; while(($arr[$r] > $p) && ($r > $left)) $r--; if($l <= $r) { $temp = $arr[$l]; $arr[$l] = $arr[$r]; $arr[$r] = $temp; $l++; $r--; }}while($l <= $r);if($left < $r) QuickSort(&$arr,$left,$r);if($l < $right) QuickSort(&$arr,$l,$right);}= $i; $j--) //[0,i-1] [i,n-1]{if ($array[$j] > $array[$j + 1]){$temp = $array[$j];$array[$j] = $array[$j + 1];$array [$j + 1] = $temp;}}}return $array;}$array = array (3,6,1,5,9,0,4,6,11);print_r (bubblesort ($array));echo '
';function quicksort ($array){$n = count ($array);if ($n <= 1){return $array;}$key = $array['0'];$array_r = array ();$array_l = array ();for ($i = 1; $i < $n; $i++){if ($array[$i] > $key){$array_r[] = $array[$i];}else{$array_l[] = $array[$i];}}$array_r = quicksort ($array_r);$array_l = quicksort ($array_l);$array = array_merge ($array_l, array($key), $array_r);return $array;}print_r (quicksort ($array));echo '
';function insertsort ($array){$n = count ($array);for ($i = 1; $i < $n; $i++) //[0,i-1] [i,n]{$j = $i - 1;$temp = $array[$i];while ($array[$j] > $temp){$array[$j + 1] = $array[$j];$array[$j] = $temp;$j--;}}return $array;}print_r (insertsort ($array));?> $tmp){ $arr[$j+1] = $arr[$j]; $arr[$j] = $tmp; $j--; }}return $arr;}/*【选择排序(一维数组)】【基 本思想】:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。【示例】:[初 始关键字] [49 38 65 97 76 13 27 49]第一趟排序后 13 [38 65 97 76 49 27 49]第 二趟排序后 13 27 [65 97 76 49 38 49]第三趟排序后 13 27 38 [97 76 49 65 49]第 四趟排序后 13 27 38 49 [49 97 65 76]第五趟排序后 13 27 38 49 49 [97 97 76]第 六趟排序后 13 27 38 49 49 76 [76 97]第七趟排序后 13 27 38 49 49 76 76 [ 97]最 后排序结果 13 27 38 49 49 76 76 97*/function select_sort($arr){$count = count($arr);for($i=0; $i<$count; $i++){ $k = $i; for($j=$i+1; $j<$count; $j++){ if ($arr[$k] > $arr[$j]) $k = $j;} if($k != $i){ $tmp = $arr[$i]; $arr[$i] = $arr[$k]; $arr[$k] = $tmp; }}return $arr;}/*【冒泡排序(一维数组) 】【基本思想】:两两比较待排序数据元素的大小,发现两个数据元素的次序 相反时即进行交换,直到没有反序的数据元素为止。【排序过程】:设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据 轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是 轻者在上,重者在下为止。【示例】:49 13 13 13 13 13 13 1338 49 27 27 27 27 27 2765 38 49 38 38 38 38 3897 65 38 49 49 49 49 4976 97 65 49 49 49 49 4913 76 97 65 65 65 65 6527 27 76 97 76 76 76 7649 49 49 76 97 97 97 97*/function bubble_sort($array){$count = count($array);if ($count <= 0) return false;for($i=0; $i<$count; $i++){ for($j=$count-1; $j>$i; $j--){ if ($array[$j] < $array[$j-1]){ $tmp = $array[$j]; $array[$j] = $array[$j-1]; $array[$j-1] = $tmp; } }}return $array;}/*【快速排序(一 维数组)】【基本思想】:在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为 左右两个较小的无序区:R[1..I-1]和R[I 1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大 于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I 1..H](1≤I≤H),当R[1..I-1] 和R[I 1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。【示例】:初始关键字 [49 38 65 97 76 13 27 49]第一次交换后 [27 38 65 97 76 13 49 49]第二次交换后 [27 38 49 97 76 13 65 49]J向左扫描,位置不变,第三次交换后 [27 38 13 97 76 49 65 49]I向右扫描,位置不变,第四次交换后 [27 38 13 49 76 97 65 49]J向左扫描 [27 38 13 49 76 97 65 49](一次划分过程)初始关键字 [49 38 65 97 76 13 27 49]一趟排序之后 [27 38 13] 49 [76 97 65 49]二趟排序之后 [13] 27 [38] 49 [49 65]76 [97]三趟排序之后 13 27 38 49 49 [65]76 97最后的排序结果 13 27 38 49 49 65 76 97各趟排序之后的状态*/function quick_sort($array){if (count($array) <= 1) return $array;$key = $array[0];$left_arr = array();$right_arr = array();for ($i=1; $i
/** * 排列组合 * 采用二进制方法进行组合的选择,如表示5选3时,只需有3位为1就可以了,所以可得到的组合是 01101 11100 00111 10011 01110等10种组合 * * @param 需要排列的数组 $arr * @param 最小个数 $min_size * @return 满足条件的新数组组合 */function pl($arr,$size=5) { $len = count($arr); $max = pow(2,$len); $min = pow(2,$size)-1; $r_arr = array(); for ($i=$min; $i<$max; $i++){ $count = 0; $t_arr = array(); for ($j=0; $j<$len; $j++){ $a = pow(2, $j); $t = $i&$a; if($t == $a){ $t_arr[] = $arr[$j]; $count++; } } if($count == $size){ $r_arr[] = $t_arr; } } return $r_arr; }$pl = pl(array(1,2,3,4,5,6,7),5);var_dump($pl);//递归算法//阶乘function f($n){ if($n == 1 || $n == 0){ return 1; }else{ return $n*f($n-1); }}echo f(5);//遍历目录function iteral($path){ $filearr = array(); foreach (glob($path.'\*') as $file){ if(is_dir($file)){ $filearr = array_merge($filearr,iteral($file)); }else{ $filearr[] = $file; } } return $filearr;}var_dump(iteral('d:\www\test'));
您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号