求全排列的两种方法

打印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;//打印排列总数
}

 

posted @ 2020-05-09 19:59  一只蒟蒻也有大佬梦  阅读(406)  评论(0编辑  收藏  举报