博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php 经典算法
阅读量:4618 次
发布时间:2019-06-09

本文共 4604 字,大约阅读时间需要 15 分钟。

本文实例总结了PHP经典算法。分享给大家供大家参考,具体如下:

1、首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半。

思路:多少行for一次,然后在里面空格和星号for一次。

';}

 

 

2、冒泡排序,C里基础算法,从小到大对一组数排序。

思路:这题从小到大,第一轮排最小,第二轮排第二小,第三轮排第三小,依次类推……

$arr[$j]){
//从小到大 $p = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j]= $p; } }}var_dump($arr);

 

 

3、杨辉三角,用PHP写。

思路:每一行的第一位和最后一位是1,没有变化,中间是前排一位与左边一排的和,这种算法是用一个二维数组保存,另外有种算法用一维数组也可以实现,一行 一行的输出,有兴趣去写着玩下。

1

1   1
1   2   1
1   3   3   1
1   4   6   4   1
1   5  10  10   5   1

'; }

 

 

4、在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式。

思路:找到比要插入数大的那个位置,替换,然后把后面的数后移一位。

 

= $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; }}

 

 

5、对一组数进行排序(快速排序算法)。

思路:通过一趟排序分成两部分,然后递归对这两部分排序,最后合并。

 

6、在一个数组查找你所需元素(二分查找算法)。

思路:以数组中某个值为界,再递归进行查找,直到结束。

 

 
8、牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。(来自论坛)
=4 && $j<15) {
$num++;t($n-$j);} if($j==20){
$num--;} } return $num;}//testecho t(8);

 

 
冒泡排序 (bubble sort) — O(n2)
$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 '
';}

 

 
$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
';}/*几种排序算法的比较和选择1. 选取排序方法需要考虑的因素:(1) 待排序的元素数目n;(2) 元素本身信息量的大小;(3) 关键字的结构及其分布情况;(4) 语言工具的条件,辅助空间的大小等。2. 小结:(1) 若n较小(n <= 50),则可以采用直接插入排序或直接选择排序。由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较 好。(2) 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。(3) 若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。 快速排序是目前基于比较的内部排序法中被认为是最好的方法。(4) 在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:当文件的n个关 键字随机分布时,任何借助于"比较"的排序算法,至少需要O(nlog2n)的时间。(5) 当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。*//*排序测试*/$a = array('12','4','16','8','13','20','5','32');echo 'The result of insert sort:';$insert_a = insert_sort($a);display_arr($insert_a);echo 'The result of select sort:';$select_a = select_sort($a);display_arr($select_a);echo 'The result of bubble sort:';$bubble_a = bubble_sort($a);display_arr($bubble_a);echo 'The result of bubble sort:';$quick_a = quick_sort($a);display_arr($quick_a);

 

转载于:https://www.cnblogs.com/lingwu/p/9366259.html

你可能感兴趣的文章
LeetCode 750. Number Of Corner Rectangles
查看>>
LeetCode 983. Minimum Cost For Tickets
查看>>
LeetCode 723. Candy Crush
查看>>
LeetCode 881. Boats to Save People
查看>>
LeetCode 334. Increasing Triplet Subsequence
查看>>
LeetCode 877. Stone Game
查看>>
LeetCode 712. Minimum ASCII Delete Sum for Two Strings
查看>>
LeetCode 931. Minimum Falling Path Sum
查看>>
LeetCode 718. Maximum Length of Repeated Subarray
查看>>
LeetCode 446. Arithmetic Slices II - Subsequence
查看>>
LeetCode 740. Delete and Earn
查看>>
LeetCode 813. Largest Sum of Averages
查看>>
LeetCode 1143. Longest Common Subsequence
查看>>
LeetCode 1000. Minimum Cost to Merge Stones
查看>>
LeetCode 1130. Minimum Cost Tree From Leaf Values
查看>>
LeetCode 935. Knight Dialer
查看>>
LeetCode 787. Cheapest Flights Within K Stops
查看>>
LeetCode 978. Longest Turbulent Subarray
查看>>
LeetCode 837. New 21 Game
查看>>
LeetCode 801. Minimum Swaps To Make Sequences Increasing
查看>>