Советы по реализации алгоритма перестановки в Java

В рамках школьного проекта мне нужно написать функцию, которая будет принимать целое число N и возвращать двумерный массив каждой перестановки массива {0, 1, ... , N-1}. Объявление будет выглядеть как общедоступные статические int [] [] перестановки (int N).

Алгоритм, описанный на http://www.usna.edu/Users/math/wdj/book/node156.html - вот как я решил реализовать это.

Я довольно долго боролся с массивами и массивами ArrayLists и ArrayLists of ArrayLists, но пока что я ' Мы были разочарованы, особенно пытаясь преобразовать 2d ArrayList в 2d массив.

Поэтому я написал его на javascript. Это работает:

function allPermutations(N) {
    // base case
    if (N == 2) return [[0,1], [1,0]];
    else {
        // start with all permutations of previous degree
        var permutations = allPermutations(N-1);

        // copy each permutation N times
        for (var i = permutations.length*N-1; i >= 0; i--) {
            if (i % N == 0) continue;
            permutations.splice(Math.floor(i/N), 0, permutations[Math.floor(i/N)].slice(0));
        }

        // "weave" next number in
        for (var i = 0, j = N-1, d = -1; i < permutations.length; i++) {
            // insert number N-1 at index j
            permutations[i].splice(j, 0, N-1);

            // index j is  N-1, N-2, N-3, ... , 1, 0; then 0, 1, 2, ... N-1; then N-1, N-2, etc.
            j += d;
            // at beginning or end of the row, switch weave direction
            if (j < 0 || j >= N) {
                d *= -1;
                j += d;
            }
        }
        return permutations;
    }
}

Итак, как лучше всего перенести это на Java? Могу я сделать это только с примитивными массивами? Нужен ли мне массив ArrayLists? Или ArrayList из ArrayLists? Или есть какой-то другой тип данных лучше? Что бы я ни использовал, мне нужно иметь возможность преобразовать его обратно в массив примитивных массивов.

Может быть, есть лучший алгоритм, который упростил бы это для меня ...

Заранее благодарю вас за ваш совет!

11
задан Trevor Dixon 5 October 2016 в 14:32
поделиться