字典排序算法实现全排列

相关资料免积分下载: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

posted @ 2012-10-18 17:01  曾是土木人  阅读(4141)  评论(0编辑  收藏  举报