全排列生成器

给定n≥1个元素的集合,问题是输出这个集合中所有元素的排列。例如:如果集合是{ a, b, c },那么,这个集合元素的全排列为:{ (a,b,c), (a,c,b), (b,a,c), (b,c,a), (c,a,b), (c,b,a) }。容易看出,如果给定的集合中有n个元素,那么就有n!个不同的排列。通过下面的例子可以看出算法的简单思路:集合有四个元素,(a,b,c,d),答案可以这样构造:

1. a后接(b, c, d)的排列

2. b后接(a, c, d)的排列

3. c后接(a, b, d)的排列

3. d后接(a, b, c)的排列

可见,如果能生成n – 1个元素的全排列,就能生成n个元素的全排列。

设定3个参数,分别是存放元素的数组、参与排列的第一个元素的位置以及数组中元素的个数:

perm(a,k,n),调用参数:a,0,n。


voidperm (char *a, const intkconstintn) { 

//n 是数组a的元素个数,生成a[k],…,a[n-1]的全排列

    inti;

    if (k = = n-1) {     // 终止条件,输出排列

        for( i=0;i<n;i++)  cout << a[i]<< “ ”;   // 输出包括前

                                                  // 缀,以构成整个问题的解

        cout << endl;

       }

     else {    // a[k],…,a[n-1] 的排列大于1,递归生成

        for (i= k; i < n;i++) {

             char temp = a[k]; a[k]= a[i]; a[i]= temp  //交换a[k]

              // a[i]

             perm(a,k+1,n)// 生成 a[k+1],…,a[n-1]的全排列

             temp= a[k]; a[k]= a[i]; a[i]= temp;  

                 //再次交换a[k] a[i] , 恢复原顺序

    }

 } //else结束

}  // perm结束


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值