假设要求字符串/数组的全排序,例如:"123"的全排序,第1位有3种选择,第2位有2种选择,第3位1种选择,时间复杂度显然是3!.实际上容易知道,对于n个字符,全排序一共有n!种可能,是n!时间复杂度的.我们需要找一个算法求出所有的可能的排序,最好的办法是递归,如果选用循环,需要n层嵌套,不太现实.假设我们已经拥有一个函数 FullPermutation(A[n])能将数组A[n]全排序,于是,我们可以将A[n]分为A[1]和A[n-1]两个子问题,其中,A[1]可以有n种选择,选择办法是:将A[1]和A[i]交换,其中,i=1,2,3,4.......记得交换后,需要复原.A[n-1]的全排序可以通过调用FullPermutation()完成.
递推公式:
F(n): = Done n=1
= n*F(n-1) n>1
由上面的分析和递推公式就很容易写出代码了:
#include<iostream>
using namespace std;
void Full_permutation(int* A,int beg,int end)
{
if(beg == end)
{
for(int i=0;i<=end;++i)
cout<<A[i]<<' ';
cout<<endl;
return ;
}
for(int i=beg;i <= end;