php两组数据算法 php数据结构与算法

php实现全组合算法

?php

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、微信平台小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了沁县免费建站欢迎大家使用!

/**

* 在数组$a中任意m个元素组合

*

* @param array $a 候选的集合

* @param int $n 候选的集合大小

* @param int $m 组合元素大小

* @param array $b 储存当前组合中的元素,这里储存的是元素键值

* @param int $M 相当一个常量,一直保持不变

* @return */

function combine($a,$n,$m,$b,$M){

for($i=$n;$i=$m;$i--){

$b[$m-1]=$i-1;

if($m 1){

$combine[]=combine($a,$i-1,$m-1,$b,$M);

}else{

$onecombine='';

for($j=$M-1;$j=0;$j--){

$onecombine.=$a[$b[$j]];

}

$combine[]=$onecombine;

$onecombine='';

}

}

return $combine;

}

/**

* 递归输出数组

*

* @param array $arr 待输出的数组

* @return int 返回数组元素个数*/

function recursionarray($arr){

$i=0;

foreach($arr as $value){

if(is_array($value)){

$i+=recursionarray($value);

}else{

echo $value."br/";

$i++;

}

}

return $i;

}

$a=array('A','B','C','D','E','F','G','H','I','J');

$b=array();

$combine=combine($a,10,5,$b,5);

$count=recursionarray($combine);

echo "总共有".$count."组合";

?

PHP实现常见的排序算法

注:为方便描述,下面的排序全为正序(从小到大排序)

假设有一个数组[a,b,c,d]

冒泡排序依次比较相邻的两个元素,如果前面的元素大于后面的元素,则两元素交换位置;否则,位置不变。具体步骤:

1,比较a,b这两个元素,如果ab,则交换位置,数组变为:[b,a,c,d]

2,比较a,c这两个元素,如果ac,则位置不变,数组变为:[b,a,c,d]

3,比较c,d这两个元素,如果cd,则交换位置,数组变为:[b,a,d,c]

完成第一轮比较后,可以发现最大的数c已经排(冒)在最后面了,接着再进行第二轮比较,但第二轮比较不必比较最后一个元素了,因为最后一个元素已经是最大的了。

第二轮比较结束后,第二大的数也会冒到倒数第二的位置。

依次类推,再进行第三轮,,,

就这样最大的数一直往后排(冒),最后完成排序。所以我们称这种排序算法为冒泡排序。

选择排序是一种直观的算法,每一轮会选出列中最小的值,把最小值排到前面。具体步骤如下:

插入排序步骤大致如下:

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。

步骤:

从数列中挑出一个元素,称为 “基准”(pivot),

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

用php写一个简单的算法

俩个数组是不对等的哈 那$arr1循环到第10次的时候我 $arr2继续向下还是回到最初

假如从$arr1[6]开始循环 得到的是$arr1[6].$arr2[0], 那再次回到$arr1[6]时是$arr1[6].$arr2[0] 还是$arr1[6].$arr2[11]

PHP二分查找算法的实现方法示例

本文实例讲述了PHP二分查找算法的实现方法。分享给大家供大家参考,具体如下:

二分查找法需要数组是一个有序的数组

假设我们的数组是一个递增的数组,首先我们需要找到数组的中间位置.

1.

要知道中间位置就需要知道起始位置和结束位置,然后取出中间位置的值来和我们的值做对比。

2.

如果中间值大于我们的给定值,说明我们的值在中间位置之前,此时需要再次二分,因为在中间之前,所以我们需要变的值是结束位置的值,此时结束位置的值应该是我们此时的中间位置。

3.

反之,如果中间值小于我们给定的值,那么说明给定值在中间位置之后,此时需要再次将后一部分的值进行二分,因为在中间值之后,所以我们需要改变的值是开始位置的值,此时开始位置的值应该是我们此时的中间位置,直到我们找到指定值。

4.

或者中间值等于最初的起始位置,或结束位置(此时说明给定值未找到),下面我们来用代码实现~

//循环实现

function

getValue($num,$arr)

{

//查找数组的中间位置

$length=count($arr);

$start=0;

$end=$length;

$middle=floor(($start+$end)/2);

//循环判断

while($start$end-1)

{

if($arr[middle]==$num)

{

return

middle+1;

}

elseif($arr[middle]$num)

{

//如果当前要查找的值比当前数组的中间值还要打,那么意味着该值在数组的后半段

//所以起始位置变成当前的middle的值,end位置不变。

$start=$middle;

$middle=floor(($start+$end)/2);

}

else{

//反之

$end=$middle;

$middle=floor(($start+$end)/2);

}

}

return

false;

}

//递归实现

/*

*

从数组中获取元素值

*

@param1

int

$num,要查找的目标值

*

@param2

array

$arr,要查找的数组

*

@param3

int

$start,查找的起始位置

*

@param4

int

$end,查找的结束位置

*

@return

mixed,找到了返回位置,没找到返回false

*/

function

getValue4($num,$arr,$start

=

0,$end

=

100){

//采用二分法查找

$middle

=

floor(($end

+

$start)

/

2);

//判断

if($arr[$middle]

==

$num){

//已经找到了,递归的出口

return

$middle

+

1;

}elseif($arr[$middle]

$num){

//要查找的元素在数组的后半段

$start

=

$middle

+

1;

//边界值

if($start

=

$end){

//没有找到,但是已经超出边界值,递归出口

return

false;

}

//调用自己去查找:递归点

return

getValue4($num,$arr,$start,$end);

//getValue4($num,$arr,51,100)

}else{

//要查找的元素在数组的前半段

$end

=

$middle

-

1;

//判断边界值

if($end

0)return

false;

//调用自己:递归点

return

getValue4($num,$arr,$start,$end);

//getValue4($num,$arr,0,49)

}

//都没有找到

return

false;

}

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》及《php查找技巧与方法总结》

希望本文所述对大家PHP程序设计有所帮助。


当前名称:php两组数据算法 php数据结构与算法
当前路径:http://pwwzsj.com/article/doceiho.html