上节算法课提到了全排列的生成问题,今天自己在网上查找了一些资料,总结起来有一下几种方法:
一.递归类算法。
二.字典序法。
三.递增进位数制法。
四.递减进位数制法。
五.邻位交换法。
六.n进位制法。
下面一一介绍一下这几种算法。
一.递归类算法。
递归类算法比较简洁,实现的方法也有多种。
1.递归算法(非字典序)
1 #include<iostream> 2 #include<algorithm> 3 4 5 using namespace std; 6 int sum=0; 7 int a[10]; 8 int n; 9 //考虑[l,n-1]区间的全排列 10 void Perm(int l) 11 { 12 //输出结果,总排列数加一 13 if(l==n-1) 14 { 15 for(int i=0;i<n;i++) 16 { 17 printf("%d ",a[i]); 18 } 19 printf("\n"); 20 sum++; 21 } 22 else 23 { 24 //考虑[l+1,n-1]的排列 25 Perm(l+1); 26 for(int i=l+1;i<n;i++) 27 { 28 //当前位(l)与后面的每一位(l+i)分别交换。 29 swap(a[l],a[i]); 30 //当前位(l)已经确定了 ,现在考虑[l+1,n-1]的排列。 31 Perm(l+1); 32 //还原 33 swap(a[l],a[i]); 34 } 35 } 36 } 37 int main() 38 { 39 freopen("data.out","w",stdout); 40 scanf("%d",&n); 41 for(int i=0;i<n;i++) 42 { 43 a[i]=i+1; 44 } 45 Perm(0); 46 printf("共%d种排列。\n",sum); 47 return 0; 48 }