全排列 Java實現

2021-08-21 13:52:22 字數 863 閱讀 4771

public static void permutation(charss,int i)

if(i==ss.length-1)else)

可以看到先是a和a交換了位置(相當於沒交換,但也算一種情況),然後進行遞迴呼叫,

從注釋4可以看到i+1,可以想到遞迴呼叫裡面就會依據當前已經交換了的狀態(此處a與a交換)繼續進行交換,

當然下一步遞迴呼叫交換b與b(i變成i+1了嘛),依次類推,但遞迴交換到最後會到注釋2的判斷,

發現此時i已經是陣列的最後乙個元素下標了(即已經沒有後續元素給他交換),因此這樣就已經形成了一種排列,輸出排列。

好,第一次輸出結果輸出完了之後,終於有機會到達依次注釋5了,從上面結果分析,

第一次全排列輸出應該是a,b,c,d因為每一次都是和自己的位置做交換,

下面從第乙個跳出遞迴的地方分析,

第一次跳出來的是c,此時i=2,j=2

(因為(i+1=陣列長度-1)之後就符合注釋2的判斷,形成一種排列,上面說過,最後乙個元素已經沒有後續元素和他進行交換),

跳出遞迴後,就在注釋5處把交換過的字首換回來(雖然這裡無影響)

然後j++之後,然後繼續for迴圈,此時i=2,j=3,

此時終於交換了不同的元素了!交換的是c與d,然後也是遞迴呼叫,但是發現遞迴下去

也是達到了i+1=陣列長度-1 符合注釋2的判斷,所以此時輸出a,b,d,c的排列,好,這裡輸出完之後,也相應地結束了關於c這一次的遞迴呼叫了, 就退到了b(即i=1,j=1)其實到了這裡就和上面的一樣,繼續執行迴圈體,i=1,j=2,然後交換字首,

即b與c交換,然後繼續遞迴呼叫,其實就是在這樣的字首下進行剛剛講過的遞迴過程,

當然注意退出遞迴時,要把之前的交換過的字首換回來,以便下一次字首交換。

全排列實現

參考的是 演算法競賽入門 p185 方法是用乙個額外的陣列a,不斷放入物件到這個陣列中,直到n個為止。include using namespace std int total 0 void permutation char s,char a,int n,int cur total cout end...

Java全排列筆記

題目描述 輸入乙個字串,列印出該字串的所有排列。例如,輸入字串 abc 則輸出有字元 a b c 所能排列出來的所有字串 abc acb bac bca cab cba 思路解析 遞迴法 從集合中依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素的全...

java全排列演算法

遞迴全排列 以num 1,2,3,4,5 為例 1.f1 0,num 2.i 0 i 4遞迴到最後乙個元素,輸出1 2 3 4 5 3.i 4 i 3交換4 5,i 3 i 4,輸出1 2 3 5 4 4.i 4 i 3,5 4換回來,for迴圈完畢,返回上一層 5.i 3 i 2 交換3 4,i ...