对于1个数的全排列,直接输出就可以了。
对于两个数的全排列,例如1和2,假定1的位置不变,就退化成1个数的全排列,之后交换1和2的位置,假定2的交换两个数位置即可。
#1和2的全排列:
1 2 #假定1的位置不变,就退化成1个数的全排列,直接输出即可 2 1 #交换1和2的位置,假定2的位置不变,就退化成1个数的全排列
以此类推,可以得到n个数的全排列。
具体算法:
#include<iostream> #include<string.h> #include<limits> using namespace std; void swap(int *x, int a, int b){ int tmp = x[a]; x[a] = x[b]; x[b] = tmp; } void full_permutation(int k, int n, int *x){ if( k== n){ for (int i = 0; i <n; i++) cout<<x[i]<<" "; cout<<endl; return ; } for(int i = k ; i < n; i++){ swap(x, i, k); full_permutation(k+1, n, x); swap(x, k, i); } } int main(){ int N = 3; int x[N] = {2,3,4}; full_permutation(0, N, x); return 0; }
运行结果: