全排列的实现

Posted 爱简单的Paul

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全排列的实现相关的知识,希望对你有一定的参考价值。

全排列的实现-- 递归

中心思想: 
设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;
}

 

以上是关于全排列的实现的主要内容,如果未能解决你的问题,请参考以下文章

递归实现全排列

全排列算法--递归实现(Java)

Java实现全排列

算法——全排列

JS实现全排列

全排列和全组合实现