求解n个元素{r1,r2,…,rn}的全排列。 n个元素的全排列有n!种可能。

求解n个元素{r1,r2,…,rn}的全排列。

n个元素的全排列有n!种可能。
解题基本方法:
(1)固定位置放元素
(2)固定元素找位置

1.固定位置放元素

假设R={r1,r2,…,rn}是待排列的n个元素,Ri=R-{ri}。假设集合Ri中元素的全排列记为perm(Ri)。
(ri)perm(Ri)表示在全排列perm(Ri)的每一个排列的第一个位置加前缀ri得到的排列。


#include <stdio.h>
 
int swap(int *a,int *b)
{
   int temp;
   temp=*a;
   *a=*b;
   *b=temp;
   return 0;
}  

void perm(int  r[], int i, int  n) {
	if ( i == n ) {                           // 只有一个数值
	    for (int j = 0; j <= n; j++) {        // 输出结果
	        printf("%d",r[j]);
	    }
	    printf("\n");
	} 
	else {
	    for (int j = i; j <= n; j++) {
	    	int *a = &r[i];
	    	int *b = &r[j];
			swap(a,b);					// 交换r[i]与r[j]
     		perm(r, i + 1, n);                //计算i+1~ n 全排列 
	        swap(a,b);
  	    }
	}
}
int main (void){
		int arr[] = {1,2,3};
		perm(arr,0,2);
	}

2.固定元素找位置

在 n-1 个元素的全排列基础上,将某个元素插入到每个位置上,进而得出 n 个元素的全排列。
基本过程:
将n放在p[1]位置上,并求得剩余N-1个元素在p[2]~p[n]的全排列,这就是一个子问题了;
将n放在p[2]位置上,并用p[1]和p[3]~p[n]产生n-1个元素的全排列;
将n放在p[3]位置上,并用p[1]、p[2]和p[4]~p[n]产生n-1个元素的全排列;
 ...........
直到将n放在p[n]位置上,并用p[1..n-1]产生n-1个元素的全排列。


#include <stdio.h>

void perm2(int p[], int n) {
	
	int NUM = n-1;//这里是计算数组最大的下标 
	int i,j;
	
	if (n == 0) {                                // 元素集合为空                                   
	        for (i = 0; i <= NUM ; i++) {            // 输出结果
	            printf("%d",p[i]);
	        }
	        printf("\n");
	    }
	    else {
	        for (j = 0; j <= NUM; j++) {
	            if (p[j] == 0) {
	               p[j] = n;
	               perm2(p, n-1);                
	               p[j] = 0;
	           }
	       }
	  }
}
void main(void)
{
	int arr[] = {0,0,0};
	perm2(arr,3);	
}



  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值