← Назад к математике

Генерация всех перестановок

Рекурсивная генерация всех перестановок чисел от 1 до n

🐍 Python
n = int(input())
used = [0] * (n + 1)
Alf = list(range(1, n + 1))

def gen(p, n):
    if len(p) == n:
        print(*p)
        return
    for c in Alf:
        p.append(c)
        if not used[c]:
            used[c] = 1
            gen(p, n)
            used[c] = 0
        p.pop()

p = []
gen(p, n)
⚙️ C++
#include <bits/stdc++.h>
using namespace std;

vector<int> used;
vector<int> Alf;
vector<int> p;

void gen(vector<int>& p, int n) {
    if (p.size() == n) {
        for (int x : p) cout << x << " ";
        cout << "\n";
        return;
    }
    for (int c : Alf) {
        p.push_back(c);
        if (!used[c]) {
            used[c] = 1;
            gen(p, n);
            used[c] = 0;
        }
        p.pop_back();
    }
}

int main() {
    int n;
    cin >> n;
    used.resize(n + 1);
    for (int i = 1; i <= n; i++) {
        Alf.push_back(i);
    }
    gen(p, n);
    return 0;
}

Генерация перестановок рекурсивным перебором

Перестановка — это упорядоченный набор всех элементов множества. Количество перестановок из n элементов равно n!.

Алгоритм

Порядок вывода

Перестановки генерируются в лексикографическом порядке.

Временная сложность: O(n!)

Формат ввода и вывода

Ввод: n — количество элементов

Вывод: все перестановки чисел от 1 до n

Пример для n=3:

3

Вывод:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

Попробовать онлайн

Результат появится здесь...