【算法导论06】递归算法-perm算法

06递归算法-perm算法

问题描述:
给定一个含有n个数字的序列,设计算法对该序列进行全排列。

思路分析:
对n个数字序列进行全排列,最简单的思考方式是将n个数字依次作为序列的开头,得到n个n维序列,并对每个序列的第2个数到第n个数字进行全排列,由此产生递归。

算法分析:
将数字序列存放于数组A[N]中,每次交换A[0]与Ai,然后对A[1]到A[n-1]序列进行全排列。为了方便,设置参数p,q,表示从p到q的全排列,则每次交换A[p]与A[i],并对剩下序列A[p+1]到A[q]进行全排列,即可完成一次以A[p]为首对全排列。当一次以A[p]为首的全排列结束后,由于前面对A[p]与A[i]进行了交换,所以在第二次全排列之前将A[p]与A[i]再次交换回来。将上述算法放置于一个循环中,循环次数为数组长度,即p到q,即可实现所有以A[i](i从p到q)开头的全排列。由于在循环中p不断增加,所以该递归结束的条件即为p=q,此时打印出该数。

perm算法代码:

#include<studio.h>
#include<stdlib.h>

void swap(int A[],int i,int j){
	int temp = A[i];
	A[i] = A[j];
	A[j] = temp;
}

void perm(isn A[],int p,int q){
	if(p==q){//递归结束标志
		printarray(A,p+1);
	}else{
		for(int i=p;i<=q;i++){
			swap(A,p,i);//每次把第i个交换到首部
			perm(A,p+1,q);//对除首部外其他序列进行全排列
			swap(A,p,i);//将首部再次交换回来,方便下次排列。
		}
	}
}

void printarray(int A[],int i){
	for(int j=0;j<=i;i++)
		printf(%d”,A[j]);
	printf(“\n”);
}

int main(){
int A[4] ={1,2,3,4};
perm(A,0,3);

return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值