求集合全排列算法(递归)

问题描述

给定一个集合(a1,a2,a3,…,an),求该集合的所有排列。如集合(1,2,3)的所有排列为(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)。

思路

可以发现,得到集合全排列的思想为求a1+(a2,a3,…,an)的全排列,而a1可以与集合中的n个元素进行交换,同理,(a2,a3,…,an)的全排列等于a2+(a3,a4,…,an)的全排列,以此类推,可以写出递归算法

代码

#include <iostream>
#include <cstdio>

using namespace std;

const int maxn = 1000;

void swap(int &a, int &b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}

void permutation(int a[], int k, int m) { // m为集合长度
    if(k == m) { // 递归到底层
        for(int i = 0; i <= m; i++)
            cout << a[i];
        cout << endl;
    }
    else {
        for(int i = k; i <= m; i++) 
            swap(a[k], a[i]); // 固定一个数
            permutation(a, k+1, m); // 求剩余数的全排列
            swap(a[k], a[i]); // 完成递归之后交换回来
        }
    }
}

int main() {
    int n, a[maxn];
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    permutation(a, 0, n-1);
    return 0;
}

输出

这里写图片描述

阅读更多

没有更多推荐了,返回首页