分治策略之全排列问题

问题描述:

设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。

设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中元素的全排列记为perm(X)。(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。R的全排列可归纳定义如下:

当n=1时,perm(R)=(r),其中r是集合R中唯一的元素;

当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…,(rn)perm(Rn)构成。


//排列问题(递归)
#include <iostream>

using namespace std;

template <typename Type>
void Swap(Type &a, Type &b)
{
    Type temp;
    temp = a ;
    a = b;
    b = temp;
}

template <typename Type>
void Perm(Type list[], int k, int m)
{
    //产生list[k:m]的所有排列
    if(k == m)
    {
        //只剩下一个元素
        for(int i = 0; i <= m; i++)
        {
            cout<<list[i];
        }
        cout<<endl;
    } else {
        //还有多个元素待排列,递归产生排列
        for(int i = k; i <= m; i++)
        {
            Swap(list[k],list[i]);
            Perm(list,k+1,m);
            Swap(list[k],list[i]);
        }
    }
}

int main()
{
    int n;
    cout<<"请输入需排列数的个数:"<<endl;
    cin>>n;
    int *a = new int[n];
    cout<<"输入排列的数:"<<endl;
    for(int i = 0; i < n; i++)
    {
        cin>>a[i];
    }
    Perm(a,0,n-1);
    delete a;
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值