返回

从基础开始,精通全排列Java实现,轻松搞定排列问题

前端

全排列的概念,就是从给定的n个不同的元素中,任取m个元素,按照一定的顺序排成一列,称为从n个元素中取出m个元素的一个排列。全排列是排列的一种,当m=n时,全排列就退化成了排列。

全排列的计算公式为:P(n, m) = n! / (n - m)!, 其中n!表示n的阶乘,即1 * 2 * 3 * ... * n。

在Java中,我们可以使用以下代码来计算全排列的个数:

public static int permutationCount(int n, int m) {
    if (n < 0 || m < 0 || m > n) {
        throw new IllegalArgumentException("Invalid input parameters.");
    }

    int permutationCount = factorial(n) / factorial(n - m);
    return permutationCount;
}

private static int factorial(int n) {
    int factorial = 1;
    for (int i = 1; i <= n; i++) {
        factorial *= i;
    }

    return factorial;
}

以下是一个Java程序,用于生成所有可能的全排列:

import java.util.ArrayList;
import java.util.List;

public class PermutationGenerator {

    public static void main(String[] args) {
        int[] elements = {1, 2, 3};
        List<List<Integer>> permutations = generatePermutations(elements);

        System.out.println("All possible permutations:");
        for (List<Integer> permutation : permutations) {
            System.out.println(permutation);
        }
    }

    public static List<List<Integer>> generatePermutations(int[] elements) {
        List<List<Integer>> permutations = new ArrayList<>();
        generatePermutations(elements, 0, permutations);
        return permutations;
    }

    private static void generatePermutations(int[] elements, int startIndex, List<List<Integer>> permutations) {
        if (startIndex == elements.length - 1) {
            List<Integer> permutation = new ArrayList<>();
            for (int element : elements) {
                permutation.add(element);
            }

            permutations.add(permutation);
        } else {
            for (int i = startIndex; i < elements.length; i++) {
                swap(elements, startIndex, i);
                generatePermutations(elements, startIndex + 1, permutations);
                swap(elements, startIndex, i);
            }
        }
    }

    private static void swap(int[] elements, int i, int j) {
        int temp = elements[i];
        elements[i] = elements[j];
        elements[j] = temp;
    }
}

以上代码使用递归的方式来生成所有可能的全排列。首先,它将第一个元素固定在第一个位置,然后递归地生成剩余元素的所有可能的排列。然后,将第一个元素固定在第二个位置,再次递归地生成剩余元素的所有可能的排列。以此类推,直到将第一个元素固定在最后一个位置。

这样,就可以生成所有可能的全排列。