n个字符全排列问题(c++实现,详细图解说明)

如果你学过树的遍历知识应该就会很好理解。排列过程正如二叉树的中序遍历一样,如下:

void InOrderTraversal( BinTree BT )
{
    if( BT ) 
    {
        InOrderTraversal( BT->Left );
        printf(“%d”, BT->Data);
        InOrderTraversal( BT->Right );
    }
}

搜索结点一直走到树的最左端,如果该节点无左儿子,则输出结点信息,进入右儿子(有无均可),在搜索其左儿子,在此我就不过多介绍中序遍历,详情待我之后补上。现在我们来讨论全排列与中序搜索的相似点。先放图

n个字符全排列问题(c++实现,详细图解说明)_第1张图片
                                                                                          图     1
对于"abc"三者我们该怎么全排列呢,全排列的思想是什么呢?(可能会说的有些过于详细)

首先我们得了解全排列是何意:

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。显而易见,全排列数f(n)=n*(n-1)*...1=n!,即n的阶乘。

之后从阶乘的概念中来思考计算机是如何处理的:

对于阶乘的递归表示大家想必都很熟悉:

int factorial(int n)
{
	if(n == 1)	return 1;
	else return n*factorial(n-1);
}

再想想全排列该如何实现

一共有n个位置,第一个位置有n种选择,第一个位置选定后,后n-1个位置有n-1种选择,...,后2个位置有2种选择,最后一个位置只有1种选择。
对于一开始n个位置的n种选择,我们只需按照已给排列(第一层),
把第1个元素分别于第1到n个元素互换即形成n种序列。(第二层)
以此类推,该n个序列第一个位置不动,即把把第2个元素分别于第2到n个元素互换即形成n-1种序列。(第三层)
最终我们即形成了n!个序列。(第n层,即最底层)
概念清楚了我们想想怎么实现。
 

现在回到开头所说的树:

我们把排列过程想象成树的构造过程,第一层度为n,最后一层度为1(说是0也可以),但由于是输出,所以没有儿子。我们所有已排列好的序列都在最底层有n!项。所以需要遍历的就是最底层的叶结点,结合中序遍历和阶乘递归实现,我们终于可以写出全排列实现了,代码如下:

#include 
using namespace std;
 
void swap(int &a,int &b){				//交换a,b值
	int temp=a;
	a=b;
	b=temp;
}
 
void full_permutation(char a[],int m,int MaxSize){
	if(m==MaxSize)
	{
		for(int i=1;i<=MaxSize;i++)
		{
			cout<>n;
	MaxSize = n+1;
	char a[MaxSize];
	for(int i=1;i<=MaxSize;i++)				
	{
		cin>>a[i];
	}
	full_permutation(a,m,MaxSize);
	return 0;
}

如有问题可以向我提问,你的一份评论就是我坚持的动力~

你可能感兴趣的:(胡凡--算法笔记)