演算法分析遞迴之集合的全排列問題
基於演算法分析與設計——以大學生程式設計競賽為例這本書中的第三章3.1.2集合的全排列問題
本題提出的問題是要解決n個元素的n!中排列方式,設R={r1,r2,···rn},令Ri=R-{ri}。集合的全排列記為perm(X),
則(ri)perm(X)表示在全排列perm(X)的每一個排列前加上字首ri得到的排列。R的全排列可歸納定義如下:
當n=1時,perm(R)=(r),其中r是集合R中唯一的元素;
當n>1時,perm(R)由(r1)perm(R1),(r2)perm(R2),···,(rn)perm(Rn)構成。
本問題採用java語言進行解決的程式碼如下:
public class suanfa_3_3 {
public void Perm(int list[],int k,int m) {
if(k==m) {
for(int i=0;i<=m;i++)
System.out.print(list[i]);
System.out.println();
}
else {
for(int j=k;j<=m;j++) {
swap(list,k,j);
Perm(list, k+1, m);
swap(list,k,j);
}
}
}
public void swap(int[] list,int x,int y) {
int temp;
temp=list[x];
list[x]=list[y];
list[y]=temp;
}
public static void main(String[] args) {
suanfa_3_3 ss=new suanfa_3_3();
int[] list= {1,2,3,4,5,6};
ss.Perm(list, 0, 3);
}
}
此問題的解決的本質在於,先通過一個迴圈將n個數中的第一個數進行固定,然後進行遞迴,
每進行一次遞迴就固定下來一個數,直到還剩下最後一個數時,進行交換,並且輸出,然後
再一步步的返回。
例如:陣列list[]={1,2,3,4,5,6},則呼叫Perm(list,0,3)就是產生元素1-4的全排列。