1. 程式人生 > >全排列演算法(java實現)

全排列演算法(java實現)

100題目之53題目和70題目

在做100題目的時候,全排列的演算法困擾了很久,雖然網上了搜了一些資料,可是並沒有搞懂。今天花了一個下午的時間,從新梳理了一遍,終於弄明白了。

全排列的演算法,遞迴分析網上都有:

設一組數p = {r1, r2, r3, ... ,rn}, 全排列為perm(p),pn = p - {rn}。

因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。當n = 1時perm(p} = r1。

實現java程式碼如下:

  1. publicclass permutate {  
  2.     public
    staticint total = 0;  
  3.     publicstaticvoid swap(String[] str, int i, int j)  
  4.     {  
  5.         String temp = new String();  
  6.         temp = str[i];  
  7.         str[i] = str[j];  
  8.         str[j] = temp;  
  9.     }  
  10.     publicstaticvoid arrange (String[] str, int st, int len)  
  11.     {  
  12.         if (st == len - 1)  
  13.         {  
  14.             for (int i = 0; i < len; i ++)  
  15.             {  
  16.                 System.out.print(str[i]+ "  ");  
  17.             }  
  18.             System.out.println();  
  19.             total++;  
  20.         }  
  21.         else
  22.         {  
  23.             for (int i = st; i < len; i ++)  
  24.             {  
  25.                 swap(str, st, i);  
  26.                 arrange(str, st + 1, len);  
  27.                 swap(str, st, i);  
  28.             }  
  29.         }  
  30.     }  
  31.     /** 
  32.      * @param args 
  33.      */
  34.     publicstaticvoid main(String[] args) {  
  35.         // TODO Auto-generated method stub
  36.          String str[] = {"a","b","c"};  
  37.          arrange(str, 0, str.length);  
  38.          System.out.println(total);  
  39.     }  
  40. }  

關鍵的就是arrange方法的else裡面的內容,我的理解是(以求str[] = {"a","b","c"}的排列為例子):

用i從str[st]做一遍迴圈:

每一次迴圈中,都要將str[i]與str[i]互相調換位置:第一次開始,"a"與自己換,這時候,遞迴呼叫arrange[str,st + 1, len]

這是在求取str[str...len - 1]的排列即"b","c"的排列;

第二次,"a"與"b"互相調換,遞迴呼叫arrange[str,str + 1, len]就是在求取{"a","c"}的排列。

第三次,"a"與"c"互相調換,遞迴呼叫arrange[str, str + 1,len]就是在求取"{"b","a}的排列。

下面再以"b","c"的排列求取為例:

首先還是做迴圈,第一次,"b"與自己調換,這時候,呼叫arrange[str,st + 1,len], 就是求c的排列。呵呵,這時候終於到了函式遞迴呼叫的出口了

: st = len - 1。輸出"b" "c";

第二次,類似的,輸出"c","b";

至此,"b" "c"的排列求取完畢。加上前面的a,就輸出"a""b""c" "a""c""b"。

類似的,就可以輸出所有的排列了。