全排列的三种方法(递归)

把abc全排列

方法 一:

可以看做a为前缀,bc全排列,(a与b交换)b为前缀,ac全排列,(a与c交换)c为前缀,ba全排列

在递归的时候bc全排列可看成,b为前缀,c全排列,c为前缀b全排列。

特点:明显的看出这样排列的结果不是从小到大的

代码:

//数组存到a[0]-a[n-1],调用perm(0,n)
void perm(int b,int e){
    if(b==n-1){
        //输出
        return ;
    }
    for(int i=b;i<e;i++){
        swap(a[b],a[i]);
        perm(b+1,e);
        swap(a[b],a[i]);
    }
}

方法二:

用vis数组标记,不用像方法一那样交换,而是每次都遍历所有元素,若vis[i]==0,则选中a[i]

特点:若a数组是有序的,则输出的结果也是有序的(结果从小到大)

//数组存到a[0]-a[n-1],调用perm(0)
void perm(int step){
    if(step==n){
        //输出b
        return ;
    }
    for(int i=0;i<n;i++){
        if(!vis[i]){
            vis[i]=1;
            b[step]=a[i];
            perm(step+1);
            vis[i]=0;
        }
    }
}

方法三:用next_permutation

特点:若初始数组有序,则输出的的结果也是有序

string a;
cin>>a;
do{
    cout<<a<<endl;
}while(next_permutation(a.begin(),a.end()));

猜你喜欢

转载自blog.csdn.net/m0_37579232/article/details/87888726