全排列算法C/C++

求一串数字的全排列,采用递归算法。

看下列关键代码。其中函数形参中 k 代表从数组下标几开始,

m代表数组最后一个元素的索引值。

当 k == m 时 输出此次排列。

例如我们求 1,2,3的全排列,传入此函数中。

进入第一次循环,此时 i = 0,k =0; swap两个数据,因为索引相同所以相当于第一次循环的时候没有交换。紧接着进入标号②,perm(list,k+1,m), 此时传入perm的 k 为1不等于2不输出,再次进入循环中,此时 i = k =1 索引同样相同,值依旧没变。紧接着再次进入perm(list,k+1,m),

此时 k == m 输出此排列后,第一次递归结,;返回到 k == 1 时循环中进行标号③步骤,但此时i = k =1 依旧值没变,进入下一次循环,此时 k = 1,i = 2,swap 交换后 得到 1,3,2的排列,然后又进入递归,perm(list,k+1,m),此时 k == m ==2,输出此排列。然后递归结束返回到步骤③,将交换的排列改回来,得到1,2,3。递归结束返回到 k =0时的步骤③中,进行循环,此时i也等于0,索引相同值不变。第二次循环,交换了 1 和 2 得到排列 2,1,3后进入步骤②中 k == i==1交换值不变,再次进入步骤②后k==m==2 直接输出。再次反复即可得到 1,2,3的全排列。

void perm(int list[],int k,int m){
	if(k==m){
		for(int i=0;i<=m;i++){
			cout<<list[i];
		}
		cout<<endl;
	}
	else{
		for(int i=k;i<=m;i++){
			Swap(list[k],list[i]); //1
			perm(list,k+1,m);      //2
			Swap(list[k],list[i]); //3
		}
	}
}
#include<iostream>
using namespace std;
inline void Swap(int &a,int &b){
	int t = a;
	a =b;
	b=t;
}
void perm(int list[],int k,int m){
	if(k==m){
		for(int i=0;i<=m;i++){
			cout<<list[i];
		}
		cout<<endl;
	}
	else{
		for(int i=k;i<=m;i++){
			Swap(list[k],list[i]);
			perm(list,k+1,m);
			Swap(list[k],list[i]);
		}
	}
}
int main()
{
	int a[] = {1,2,3};
	perm(a,0,2);
	return 0;

}

以上是全排列代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值