输出全排列
设R={ r1, r2, ... , rn } 为要进行全排列的n个元素,Ri = R-{ ri }。集合X中元素的全排列记为Perm(X),(ri)Perm(X)表示全排列Perm(X)的每一个排列前加上前缀ri 。
则R的全排列归纳定义为如下:
当n=1时,Perm(R) = (r);
当n>1时,Perm(R)由(r1)Perm(R1)、(r2)Perm(R2),...,(rn)Perm(Rn) 构成。
依照该定义,生成全排列的算法如下:
1 void myFullPerm(int *data,int s,int curs,int e)//各参数分别为序列、序列起点下标、当前进行全排列的序列起点下标([s, curs-1]为全排列完成的元素、[curs, e]间的元素为待进行全排列的元素)、序列终点下标。s ≤ curs ≤ e 2 { 3 if(s>curs || curs>e) return; 4 5 int i; 6 if(curs==e) 7 { 8 for(i=s;i<=e;i++) printf("%d ",data[i]); 9 printf("\n"); 10 } 11 else 12 { 13 myFullPerm(data,s,curs+1,e);//也可以去掉此句并让下面的i从curs开始,与当前的实现等价 14 for(i=curs+1;i<=e;i++) 15 { 16 swap(data[curs],data[i]); 17 myFullPerm(data,s,curs+1,e); 18 swap(data[curs],data[i]); 19 } 20 } 21 } 22 23 void swap(int &a,int &b) 24 { 25 int tmp=a; 26 a=b; 27 b=tmp; 28 }