码迷,mamicode.com
首页 > 其他好文 > 详细

全排列的实现

时间:2017-10-09 00:23:55      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:else   全排列   amp   int   iostream   using   clu   前缀   style   

全排列的实现-- 递归

中心思想: 
设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}. 
Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。 
(1)当n=1时,Perm(R)=(r),其中r是集合R中唯一的元素; 
(2)当n>1时,Perm(R)可由(r1)+Perm(R1),(r2)+Perm(R2),…,(rn)+Perm(Rn)构成。

那么具体程序要怎么实现呢?我们来个实际的例子,假设有一数列1,2,3,4 
那么1,2,3,4的全排列 
perm({1,2,3,4})=1perm({2,3,4})+2perm({1,3,4})+3perm({1,2,4})+4perm(1,2,3) 
那么我们只要将每个数,与第一个数交换不就可以得到下一个序列了。
比如{1,2,3,4}第一个与第二个数交换,那么不就得到2 {1,3,4}了。

 

// 输出n个整数的全排列
#include<iostream>
using namespace std;
void swap(int & a, int & b){
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}
void perm(int list[], int low, int high)
{
    if (low == high)   //当low == high时,此时list就是其中一个排列,所以输出
    {
        for (int i = 0; i <= high; i++){
            cout << list[i];
        }
        cout << endl;
    }
    else
    {
        for (int i = low; i <= high; i++)   // i 从 low 变化到 high,每个元素与第一个元素交换
        {
            swap(list[low], list[i]);
            perm(list, low + 1, high);  // 交换后,得到子序列,用函数perm得到子序列的全排列
            swap(list[low], list[i]); // z最后将元素交换回来,复原,然后为下一步交换另一个元素做准备
        }
    }
}

int main(){
    int list[10] = {0,1,2,3,4,5,6,7,8,9};
    perm(list, 0, 2);
    return 0;
}

 

全排列的实现

标签:else   全排列   amp   int   iostream   using   clu   前缀   style   

原文地址:http://www.cnblogs.com/simplepaul/p/7639065.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!