相关资料免积分下载:http://download.csdn.net/detail/php_fly/4660704
字典排序算法实现全排列的步骤:
总结:
1.从右向左找,找到第一个比下一个元素还小的地方,记下位置,标注为左元素。
2.从右向左找,找到第一个比左元素大的元素,记下位置,标注为右元素。
3.交换左元素和右元素。
4.不管现在左元素位置上放的是谁,将左元素右边的序列逆序。
5.这样就得到了一个新数了。
6.可以继续重复1-5,来继续得到下一个排列。
7.如果再也找不到一个比下一个元素还小的地方,那么意味着这个序列已经降序了,排列完成了,那就结束吧。
代码如下:
<?php /** * 打印数组 * * @param int $num 数组内的元素个数 */ function printArr($num){ global $array;//全局数组 for($i=0;$i<$num;$i++) echo $array[$i]; echo "<br>"; } /** * 交换值 * * @param string $a * @param string $b */ function swap(&$a,&$b){ $temp= $a; $a = $b; $b = $temp; } /** * 将第$m个和$n个之间的数据倒置排序 * * @param int $m 数组中的位序$m * @param int $n 数组中的位序$n */ function convert($m,$n){ global $array;//全局数组 for ($i=$m,$j=$n;$j>$i;$i++,$j--) swap($array[$i],$array[$j]); } /** * 对1~n进行全排列 * * @param int $num 元素的总个数 * @return 1 */ function dictionary_sort($num){ global $array;//全局数组 if ($num==1){ echo "1<br>"; return 1; } while (1){ printArr($num); //打印数组 for ($i=$num-2;$i>=0;$i--){ //步骤1:从后向前找,找到第一个比下一个元素还小的地方,记下位置,标注$i if ($array[$i]<$array[$i+1])break;//得到$i if ($i==0)return 1; //函数出口 } for ($j=$num-1;$j>$i;$j--){ //步骤2:从后向前找,找到第一个比$i元素大的元素,记下位置,标注为$j if ($array[$j]>$array[$i])break; } swap($array[$i],$array[$j]);//步骤3:交换$array[$i]和$array[$j]的数据 convert($i+1,$num-1); //步骤4: 将$i个元素右边的序列逆序 } } $array=array(); $num=5; for ($i=0;$i<$num;$i++){ $array[$i]=$i+1; } dictionary_sort($num);
原创文章:WEB开发
转载请注明出处:http://www.cnblogs.com/hongfei/archive/2012/10/18/2719680.html