参考链接:http://blog.csdn.net/hackbuteer1/article/details/6657435
假设有集合{a,b,c,d},求其全排列
方法1:
递归
求{a,b,c,d}的全排列,可转化为求:
a+{b,c,d}的全排列(即aXXX) +
b+{a,c,d}的全排列(即bXXX) +
c+{a,b,d}的全排列(即cXXX) +
d+{a,b,c}的全排列(即dXXX) 。
code:
void permutation(char* a,int k,int m)
{
if(k == m)<span style="white-space:pre"> </span>//递归出口,表示一个已完成swap的最终数列
{
for(int i = 0 ; i <= m ; ++i)
cout<<a[i];
cout<<endl;
}
else
{
for(int j = k ; j <= m ; ++j)
{
swap(a[j],a[k]);
permutation(a,k+1,m);
swap(a[j],a[k]);
}
}
}
该方法存在问题:
无法对含相同字符的序列做全排列,即比如{a,b,b},会得到重复结果
方法二:STL函数——next_permutation()
STL有一个函数next_permutation(),它的作用是如果对于一个序列,存在按照字典排序后这个排列的下一个排列,那么就返回true且产生这个排列,否则返回false。注意,为了产生全排列,这个序列要是有序的,也就是说要调用一次sort。
code:
void Foo(char *a,int length)
{
sort(a,a+length);
do
{
for(int i = 0 ; i < length ; ++i)
cout<<a[i];
cout<<endl;
}while(next_permutation(a,a+length));
}