全排列

来源:互联网 发布:淘宝的膳魔师是真的吗 编辑:程序博客网 时间:2024/04/28 16:37

n排列,按字典顺序输出所以可能

例如输入3
输出

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

 

非递归

  1. #include<iostream>
  2. #include<stdlib.h>
  3. using namespace std;
  4. void F(int n){
  5.      int i,j,k,*p=new int[n];
  6.      for(i=0;i<n;i++){
  7.              p[i]=i+1;
  8.              cout<<p[i]<<" ";}
  9.      cout<<endl;
  10.      while(1){
  11.      j=n-2;
  12.      while(j>=0&&p[j]>p[j+1])
  13.             j--;
  14.      if(j<0) break;
  15.      k=n-1;
  16.      while(p[j]>p[k])
  17.             k--;
  18.      p[j]^=p[k]^=p[j]^=p[k];
  19.      i=j+1;
  20.      k=n-1;
  21.      while(i<k){
  22.                 p[i]^=p[k]^=p[i]^=p[k];
  23.                 i++;
  24.                 k--;}
  25.      for(i=0;i<n;i++)
  26.              cout<<p[i]<<" ";
  27.      cout<<endl;}
  28.      }
  29. int main()
  30. {
  31.   int n;
  32.   while(cin>>n)
  33.   F(n);
  34.   return 0; }

 

递归

 

  1. #include<iostream> 
  2. #include<stdlib.h> 
  3. using namespace std; 
  4. void Swap(int &a,int &b) 
  5.      int temp=a;
  6.      a=b;
  7.      b=temp;
  8. void perm(int *a,int k,int m) 
  9.      if(k==m) 
  10.      { 
  11.           for(int i=0;i<=m;i++) 
  12.                   cout<<a[i]<<" "
  13.           cout<<endl; 
  14.      } 
  15.      else 
  16.           for(int i=k;i<=m;i++) 
  17.           { 
  18.                Swap(a[k],a[i]); 
  19.                perm(a,k+1,m); 
  20.                Swap(a[k],a[i]); 
  21.           } 
  22. int main() 
  23.     int n; 
  24.     cin>>n; 
  25.     int *a=new int[n]; 
  26.     for(int i=0;i<n;i++) 
  27.          a[i]=i+1; 
  28.     perm(a,0,n-1); 
  29.     delete[] a; 
  30.     return 0; 
原创粉丝点击