排列
a,b,c的排列形式有abc,acb,bac,bca,cab,cba,六种排列方式。
采用递归的方法来实现排列。众所周知,递归分为两个部分,一个是基础部分,一个是递归部分。在解决排列问题中,递归的基础部分是:当只有一个元素时,排列就是它本身。
下面主要分析递归部分。令E={e1,e2,...,en}表示n个元素的集合。Ei表示E中去除了第i个元素后的集合,perm(X)表示对集合X的排序,显然当集合X只有一个元素时{x},perm({x})=x。ei.perm(X)表示在所有X的排列前面加上ei。例如E={a,b,c};E1={b,c},perm(E1)=(bc,cb),e1.perm(E1)=(abc,acb)。所以当n>1时,perm(E) = e1.perm(E1)+e2.perm(E2)+...+en.perm(En).这种递归定义形式采用n个perm(X)来定义perm(E),其中每个X包含n-1个元素。
代码如下:
[cpp]view plaincopy
#include
usingnamespacestd;
template
inlinevoidSwap(T& a,T& b)
{
T temp = a;
a = b;
b = temp;
}
template
voidPerm(T list[],intk,intm)
{
inti;
if(k==m)
{
for(i=0; i
{
cout<
}
cout<
}
else
{
for(i=k; i
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
}
intmain()
{
charlist[] = {'a','b','c'};
Perm(list,0,3);
return1;
}