zoukankan      html  css  js  c++  java
  • 字典排序算法实现全排列

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

  • 相关阅读:
    java中浮点数的比较(double, float)(转)
    SVN与TortoiseSVN实战:补丁详解(转)
    常见名词解析
    SSL连接建立过程分析(1)
    Flash-使用变形面板制作花朵
    使用ReactiveCocoa实现iOS平台响应式编程
    【LaTeX排版】LaTeX论文排版&lt;三&gt;
    angularjs入门学习【指令篇】
    理解class.forName()
    malloc()与calloc差别
  • 原文地址:https://www.cnblogs.com/hongfei/p/2719680.html
Copyright © 2011-2022 走看看