求全排列的两种方法
打印n个数的全排列
(1)使用stl里的next_permutation()
#include<iostream> #include<algorithm> using namespace std; int main(){ int data[4]={5,2,1,4}; sort(data,data+4); do{ for(int i=0;i<4;++i) cout<<data[i]<<" "; cout<<endl; }while(next_permutation(data,data+4)); return 0; }
(2)递归求全排列
#include<iostream> using namespace std; #define Swap(a,b){int temp=a;a=b;b=temp;} int data[]={1,2,3,4}; int num=0; int Perm(int begin,int end){ int i; if(begin==end){ //递归结束产生一个全排列 num++; }else for(int i=begin;i<=end;i++){ Swap(data[begin],data[i]);//把当前第一个数和后面的所有数交换位置 Perm(begin+1,end); //去掉第一个数,第二个数与后面的所有数交换位置 以此类推 Swap(data[begin],data[i]); //恢复,用于下一次交换 } } int main(){ Perm(1,4); cout<<num<<endl;//打印排列总数 }