Некоторые комментарии уже указывают на то, что ваша рекурсивная процедура не может выполнить сортировку в конечных узлах и ожидает сортировки всего списка. Вам нужно будет вернуть накопленные строки в коллекцию, а затем отсортировать и распечатать их один раз в конце.
Что еще более важно, есть хороший алгоритм для перестановки массива в лексическом порядке. Она используется библиотечной функцией next_permutation в C ++ (которую вы можете найти для объяснений), но ее достаточно легко перевести на Java. Вы извлекаете массив char[]
, возможно, с getCharArray
, сортируете его с Arrays.sort
и запускаете его, пока он не вернет false.
/** Helper function */
void reverse(char[] a, int f, int l)
{
while(l>f)
{
char tmp = a[l];
a[l] = a[f];
a[f] = tmp;
l--; f++;
}
}
/** actual permutation function */
boolean next_permutation(char[] a)
{
if(a.length < 2) return false;
for(int i = a.length-1; i-->0;)
if(a[i] < a[i+1])
{
int j=a.length-1;
while(!(a[i] < a[j]))
j--;
char tmp=a[i];
a[i]=a[j];
a[j]=tmp;
reverse(a, i+1, a.length-1);
return true;
}
reverse(a, 0, a.length-1);
return false;
}
Как только вы поймете, что он делает, просто запустите while(next_permutation(array)) {println(array);}
и у вас все хорошо. Обратите внимание, что это очень плохо для массивов более 13 или около того элементов.