相关资料免积分下载:
字典排序算法实现全排列的步骤:
总结:
1.从右向左找,找到第一个比下一个元素还小的地方,记下位置,标注为左元素。2.从右向左找,找到第一个比左元素大的元素,记下位置,标注为右元素。3.交换左元素和右元素。4.不管现在左元素位置上放的是谁,将左元素右边的序列逆序。5.这样就得到了一个新数了。6.可以继续重复1-5,来继续得到下一个排列。7.如果再也找不到一个比下一个元素还小的地方,那么意味着这个序列已经降序了,排列完成了,那就结束吧。代码如下:
";}/** * 交换值 * * @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"; 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);
原创文章:
转载请注明出处: