Skip to content

Instantly share code, notes, and snippets.

@rjack
Created April 10, 2011 20:53
Show Gist options
  • Save rjack/912712 to your computer and use it in GitHub Desktop.
Save rjack/912712 to your computer and use it in GitHub Desktop.
Trova la prossima permutazione in ordine alfabetico.
function partial_reverse (arr, i, j)
{
var tmp;
j--;
while (i < j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++; j--;
}
return arr;
}
// Trova la prossima permutazione in ordine alfabetico.
//
// Es: > next_permutation(["a", "b", "c"]);
// ["a", "c", "b"]
function next_permutation (arr)
{
var i, j, tmp;
// se l'array ha un solo elemento o è vuoto, ritorno l'array stesso.
if (arr.length <= 1)
return arr;
// L'algoritmo è il seguente:
//
// 1. devo trovare la più lunga coda dell'array che è ordinata in modo
// decrescente. Es. in `3, 2, 5, 3, 1`, la coda è `5, 3, 1`
// 2. devo scambiare l'elemento subito precedente alla coda (nell'esempio
// è il `2`) con l'elemento subito più grande appartenente alla coda
// (nell'esempio è `3`). Quindi `3, 2, 5, 3, 1` diventa `3, 3, 5, 2, 1`
// 3. devo rovesciare l'ordine degli elementi della coda, in modo che
// siano in ordine crescente (al momento sono già ordinati in ordine
// decrescente). Es. `3, 3, 5, 2, 1` diventa `3, 3, 1, 2, 5`.
// 4. `3, 3, 1, 2, 5` è la permutazione successiva di `3, 2, 5, 3, 1`.
//
// Quando al punto 1. la coda più lunga risulta essere l'intero array,
// allora sono arrivato all'ultima permutazione possibile e ritorno
// `undefined`.
// Cerco la coda piu' lunga ordinata in modo decrescente.
// `i` vale 1 o più.
i = arr.length - 1;
while (i > 0 && arr[i] < arr[i - 1])
i--;
// Se sono arrivato all'ultima permutazione possibile rovescio l'array per
// riportarlo alla prima permutazione.
if (i === 0) {
return arr.reverse();
} else {
i--;
}
// Cerco l'elemento appartenente alla coda che è più grande dell'elemento
// arr[i].
j = arr.length - 1;
while (arr[i] >= arr[j])
j--;
// Scambio arr[i] con arr[j]
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
// Infine, rovescio la coda
partial_reverse(arr, i + 1, arr.length);
return arr;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment