Created
April 10, 2011 20:53
-
-
Save rjack/912712 to your computer and use it in GitHub Desktop.
Trova la prossima permutazione in ordine alfabetico.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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