字典排序算法實現全排列


相關資料免積分下載: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM