上节算法课提到了全排列的生成问题,今天自己在网上查找了一些资料,总结起来有一下几种方法:

一.递归类算法。

二.字典序法。

三.递增进位数制法。

四.递减进位数制法。

五.邻位交换法。

六.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 }
View Code

相关文章: