排列算法可创建所有排列的数组

时间:2018-12-09 05:31:03

标签: java algorithm permutation

我正在尝试编写一种称为置换的方法。基本上,我希望它接受一个整数,然后返回数字从0到x -1的所有排列。我意识到这应该返回一个数组数组。但是,我正在努力实现这一目标。有人可以帮我更好地考虑这个问题吗?我在用Java编码。我意识到这可能是递归问题,但除此之外,我无所适从。

我考虑过要使用两种方法,一种采用整数,并使第一个数组从0-x-1开始。然后是另一个方法,该方法采用一个数组和一些整数“开始”。这样,索引开始处的整数将不会更改,但是会与其他数字交换。这将在for循环内,以便“开始”位置将在整个数组中变化。我对此的唯一提示是我的for循环将递归调用该方法。但是,我在思考如何实际实现此功能以及交换算法时遇到了麻烦。

有人可以告诉我我是否正在考虑这项权利,以及他们是否有任何想法或提示要给我?我没有代码可以共享,因为我对此一直怀有很大的想法。

2 个答案:

答案 0 :(得分:1)

如果我对你的理解正确,这就是你想要的吗?

public class MyClass_3928{

    static List<String> listOfAllArrays = new ArrayList<>();

    public static void calculate(int[] list, int n) {
        if (n == 1) {
            listOfAllArrays.add(Arrays.toString(list));
        } else {
            for (int i = 0; i < n; i++) {
                calculate(list, n - 1);

                int j = (n % 2 == 0) ? i : 0;

                int t = list[n - 1];
                list[n - 1] = list[j];
                list[j] = t;
            }
        }

    }

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.print("How many numbers would you like to permute?");
        int numbers = Integer.valueOf(scanner.nextLine());
        int[] numbersArray = new int[numbers-1];
        System.out.println("Those numbers are");
        for (int i = 0; i < numbers-1; i++) {
            numbersArray[i] = i+1;
        }

        calculate(numbersArray, numbersArray.length);

        for (int i = 0; i < listOfAllArrays.size(); i++) {
            System.out.println(listOfAllArrays.get(i));
        }

    }

答案 1 :(得分:1)

排列可以通过典型的回溯算法解决,在该算法中,我们必须遍历状态空间中的所有可能性。回溯是一个非常重要的算法,我的建议是您看看它(通常采用递归形式)并尝试掌握它的基本概念,而不是尝试以自己的方式解决渗透问题。

基本上要找到一个排列,我们必须走n步(设置一位为一步),为每一步选择一位后,我们就有一个排列,所以我们有一个可能的解决方案(例如,{{ 1}})。之后,我们回溯到倒数第二个位,请注意,我们在第一个解决方案中选择了1,2,3,4,5,6,但是我们可以有另一个选择5,之后我们只有一个选择是6。对于其他解决方案,我们继续回溯到倒数第三位,倒数第四位...,依此类推。这就是为什么回溯被命名的原因。

您可以将回溯与DFS或二叉树上的遍历算法进行比较。它们在很多地方彼此非常相似。

下面是我针对该问题的解决方案,其中的结果是一个arrayList,置换是根据5而不是1...n给出的,但其思想完全相同。

0...n-1

}