首页 > php开发 > PHP全排列算法实现程序代码

PHP全排列算法实现程序代码

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列,当m=n时所有的排列情况叫全排列.

简介如1,2,3三个元素的全排列为:

1,2,3 
1,3,2 
2,1,3 
2,3,1 
3,1,2 
3,2,1

共3*2*1=6种 3!

2公式

全排列数f(n)=n!(定义0!=1)

递归算法

1,2,3 
1,3,2 
2,1,3 
2,3,1 
3,2,1 
3,1,2

这是由于算法只是考虑到了如何输出全排列,而没有考虑到换位是否有问题,所以我提出了解决方案,就是换位函数修改下,如 1 2 3 换位的话,不应该直接 3 2 1这样,让3和1直接换位;而是让3排在最前后,1 2 依次向后.

基本算法

以下介绍全排列算法四种:

(A)字典序法

(B)递增进位制数法

(C)递减进位制数法

(D)邻位对换法

实现全排列算法,代码如下:

<?php 
	header("content-type:text/html;charset=utf-8");/** 
	 * @param array $a 待排列的元素集合,会动态变化 
	 * @param array $b 储存当前排列 
	 * @param array $M 待排列的元素集合,相当于一个常量,始终为初始待排列的元素集合 
	 */ 
	function wholerange($a,$b,$M){ 
	 $range=array(); 
	 if(count($a) > 1){ 
	  $d=$b; 
	  foreach($a as $value){ 
	   $b[]=$value; 
	   $c=array_diff($M,$b); 
	   if(count($c) > 0){ 
	    $range[]=wholerange($c,$b,$M); 
	   } 
	   $b=$d; 
	  } 
	 }elseif(count($a) == 1){ 
	  foreach($a as $value){ 
	   $b[]=$value; 
	  } 
	  $onerange=""; 
	  foreach($b as $value){ 
	   $onerange.=$value; 
	  } 
	  $range[]=$onerange; 
	 } 
	 return $range; 
	} 
	/** 
	 * 递归输出数组 
	 * 
	 * @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'); 
	$b=array(); 
	$range=wholerange($a,$b,$a); 
	$count=recursionarray($range); 
	echo "总共有".$count."排列"; 	


本文地址:http://www.phprm.com/develop/fs9069.html

转载随意,但请附上文章地址:-)

标签:php算法 php排列算法

相关文章

发表留言