全排列(算法)

3 篇文章 0 订阅
1 篇文章 0 订阅

将一组数字全排列,比如1 2 3将这三个数字全排列:

123 132   213  231   321  312

1.观察以上几个数字,都是将第一个数字和其它数字(第二个数字或则第三个数字)交换得到另一个组合,比如123 将其第一个数字(1)跟第2个(2)或者第3个(3)交换,得到213 或 312,此时我们已经得到啦123,213,312这三个不同数字带领的组合。

swap(A,0,1)//交换第1个和第2个数字,此时是数组下标
swap(A,0,2)//交换第1个和第3个

 这样,我们就可以用循环来进行两个数字的交换

//p:代表从第几个数字开始进行排列
//q:代表到第几个数字结束排列
//比如123 从第1个数字到第3个数字进行排列,此时p=0,q=2(下标形式)
for(int i=p;i<=q;i++){
  swap(A,p,i);//交换第p个数和第i个数(此时也是下标表示)
}

2.再各对123 213 321 这三个数字的后两个数字进行全排列就是其第二个数字和第三个数字交换以下:123得到:132,213得到 231 ,321得到312,这样我们需要的数字全排列已经显现出来啦。

//再次进行排列,但是是对除第一个数之后的排列,比如123 213 321前面的数字都定好序了,再来对后面两个数字排列(将123的23排列变为23或32),此时进入递归
void perm(int A[],int p,int q){
  for(int i=p;i<=q;i++){
    swap(A,p,i);
    perm(A,p+1,q);//从第p+1个到最后一个数又进行排列
    swap(A,p,i)//将两者换回来方便后面再进行排列
}
}

3.大体思路就是这样,但是我们现在还缺少一个结束的条件,递归没有结束条件,就会一直不停的运行下去。那递归条件是什么呢,想一想,全排列,是不是从第1个数到最后一个数得到全排列,那如果我们已经全排列到最后一个数,就是只剩下123里面的3一个单独的数字没有进行排序,那是不是就已经结束排列啦。

if(p==q) {
  printArray(A,p+1);//此时满足结束条件,我们就可以把这组数字输出
}

完整代码:

#include<stdio.h>

//打印输出结果的函数
void printfArray(int A[],int n) {
	for (int i = 0; i <n;i++) {
		printf("%d",A[i]);
	}
	printf("\n");
}

//进行交换的函数
void swap(int A[], int i, int j) {
	int temp = A[i];
	A[i] = A[j];
	A[j] = temp;
}

//全排列
void perm(int A[],int p,int q) {
	//结束条件
	if (q == p) {
		printfArray(A,p+1);
	}
	else {
		for (int i = p; i <= q;i++) {
			swap(A,p,i);
			perm(A,p+1,q);
			swap(A,p,i);
		}
	}
}

//主函数
int main() {
    //条件可以自己定
	int A[3] = { 1,2,3 };
	perm(A,0,2);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值