- /*分治法――直接選擇
- 比如說a b c
- 首先將a之后的字符依次與a進行交換
- 1 b,a,c
- 2 c,b,a
- 注意這里少了一個原始數據 a,b,c。需要把原始數據也算如排列中
- 3 a,b,c
- 然后把字符移到第二個位置,將第二個位置之后的數分別與第二個位置的數進行交換
- 1 b,a,c ===> 11 b,c,a
- 2 c,b,a ===> 21 c,a,b
- 3 a,b,c ===> 31 a,c,b
- **/
- functionzuhe($arr,$begin){
- if(!is_array($arr))return;
- $N=count($arr);
- if($begin==$N-1 ||$begin>$N||$begin<0)return;
- if($begin== 0){
- print_r($arr);//輸出原始數據
- echo''
- }
- //循環將初始值與第i個值交換后進行組合
- for($i=$begin;$i<$N;$i++){
- $t=$arr[$begin];
- $arr[$begin] =$arr[$i];
- $arr[$i] =$t;
- if($i!==$begin){//i==begin時的數已經輸出過
- print_r($arr);
- echo''
- }
- zuhe($arr,$begin+1);
- $t=$arr[$begin];
- $arr[$begin] =$arr[$i];
- $arr[$i] =$t;
- }
- }
- $arr=array('a','b','c','d');
- //zuhe($arr,0);
- /*分治法――直接插入
- 初始時從0個元素開始,輸出初始序列,為組合的一個序列
- 當在來一個元素時只需將該元素放在該元素之前的元素組的不同的位置即組成了不同的排列
- 如已有元素組為a,b.新元素為c,把c分別與a,b進行交換即可(a,c,b);(c,b,a),在現有的排列上在新增元素
- 重復執行以上步驟
- */
- functionzuhe2($arr,$begin){
- if($begin==0) {
- print_r($arr);
- echo"";
- //zuhe2($arr,$begin+1);
- }
- if($begin>=count($arr))return;
- zuhe2($arr,$begin+1);//begin時的排列上一次已產生,直接新增元素
- for($i=$begin-1;$i>=0;$i--){
- $t=$arr[$begin];
- $arr[$begin] =$arr[$i];
- $arr[$i] =$t;
- print_r($arr);
- echo"";
- zuhe2($arr,$begin+1);
- $t=$arr[$begin];
- $arr[$begin] =$arr[$i];
- $arr[$i] =$t; //Vevb.com
- }
- }
新聞熱點
疑難解答