全排列的实现

参考链接: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));
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值