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