preFly

人要有所担当,
更要有所取舍!
全排列问题

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

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

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

依次递归定义,可设计Perm(R)的递归算法如下:

template<class 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]);
        }
}

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

posted on 2010-11-07 14:04  preFly  阅读(301)  评论(0编辑  收藏  举报