Java實現全排列、組合演算法

茶花盛開發表於2017-04-09

全排列

解法一:

輸入一串字元,然後對字元進行全排列,如“abc”,全排列結果為:”abc”,”acb”,”bac”,”bca”,”cab”,”cba”.

分析:從字串中選擇一個作為第一個字元,然後對剩下的字串進行全排列,如此遞迴下去,直到列印出全部排列。如:”abc”:

1、選a作為第一個字元:”abc“,”acb“;

2、選b作為第一個字元:”bac“,”bca“;

3、選c作為第一個字元:”cab“,”cba“;

參考程式碼如下:

Java實現全排列、組合演算法

遞迴實現全排列演算法

解法二:

這種解法是將字串從小大倒排序,以此得到整體的最小順,然後找到次小順序,直到得到最大順序,也就是從大到小的順序,如:”23415“,最小順序是:”12345″,次小順序是:”12354“,……..直到最大順序:”54321“。這裡重點是找到某個順序值得下一個順序。找下一個順序的演算法如下:假設到了”21543“,從後往前找到i-1位置小於i位置的下標,1<5,所以要找的下表pos=1,將下標為1的數字1,和它後面最小的且大於它的數替換,”21543”—>”23541″,然後再將下標1後面的字串翻轉得到:”23145″,這就得到了“21543”下一個順序值“23145”,如此下去,直到輸出所有結果。如果你想學習java可以來這個群,首先是二二零,中間是一四二,最後是九零六,裡面有大量的學習資料可以下載。

參考程式碼如下:

Java實現全排列、組合演算法

排列演算法的結果總共有n!個,所以時間複雜度至少n!級別。

組合演算法

組合演算法程式碼比較簡單,可以讀程式碼理解:

Java實現全排列、組合演算法

放回全排列

放回全排列就是類似於三個篩子總共有6*6*6=216中結果。使用遞迴思想解決,程式碼比較簡潔。

參考程式碼如下:

Java實現全排列、組合演算法


相關文章