您的位置:首页 > 其它

书上算法排列问题

2018-01-05 16:42 197 查看
思想:排列问题最主要是Perm()函数,例如一个很简单的例子如下:
数列是:1 2 3
当n=1时,则递归出口,换种说法就是当n=m时,也就是数列中只剩下一个数的时候,则表示交换已经结束,此时需要把这一排打印出来。
当n<m时,说明没有交换结束,则继续交换下去,但是需要注意的是,当每次我交换完之后,也是就递归结束时,我需要把数列还原为原来的数列,不然,在进行交换输出后会得不到全部,而且还会有重复;
下面我以1 2 3为例举例子然后进行理解理解:
第一次:1 2 3为本身,因为一开始都是本身和本身进行交换,所以在递归结束后,交换后缀还是本身。
第二次:1Perm(2,3);也就是1被分割出去,然后进行交换2和3;变为1 3 2
。。。。。。。。。。。。。以此下去;;;;;;
1 2 3
1      2       3

2 3     1 3     1 2

3  2    3  1    2   1
#include<stdio.h>

#include<iostream>

#include<stdlib.h>

using namespace std;

template<class Type>

inline void Swap(Type &a,Type &b)///实现两个数的交换位置

{

    Type temp=a;

    a=b;

    b=temp;

}

template<class Type>

void Perm(Type list[],int k,int 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);///(k+1的全排列)

        Swap(list[k],list[i]);///还原原来的数组

        }

    }

}

int main()

{

    int n;

    cin>>n;

    int list
;

    for(int i=0;i<n;i++)

    cin>>list[i];

    Perm(list,0,n-1);

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: