È teoricamente possibile ordinare un array negli spostamenti length(array) - length(longestIncreasingSubsequence(array))
spostando solo elementi che non sono già ordinati.Ordina array nel numero minimo di spostamenti
Se l'unica operazione consentita è una mossa sul posto, rimuovendo un elemento dall'indice A e reinserendolo nell'indice B, un elemento alla volta, come si genererebbe le mosse corrette per finire con l'array ordinato? Anche in questo caso, dovrebbero essere necessari spostamenti length(array) - length(longestIncreasingSubsequence(array))
.
Ad esempio, ecco un array:
[ 1, 8, 5, 2, 4, 6, 3, 9, 7, 10 ]
Il più lungo crescente sottosequenza è:
[ 1, 2, 4, 6, 7, 10 ]
Gli indici di tali elementi sono:
[ 0, 3, 4, 5, 8, 9 ]
Così, gli indici dobbiamo spostarci:
[ 1, 2, 6, 7]
poiché questi sono gli indici che non sono già in ordine.
Per finire con un array ordinato, gli indici finale di questi 4 elementi sono:
[ 7, 4, 2, 8]
Quindi, è necessario spostare simultaneamente 1 all'indice 7, indice 2 all'indice 4, index 6 per indicizzare 2 e indice 7 per indice 8. Il problema è che quando un elemento viene spostato, gli altri elementi vengono spostati rendendo le successive operazioni di spostamento non valide. Ho provato a trasformare questi indici, ma finora non ho trovato la lista corretta delle mosse richieste. Qualche idea?
Spero di aver spiegato il problema abbastanza bene. Per favore, fai domande e io chiarirò. Grazie!
Come si è trasformata gli indici? Se dopo lo scambio di '1 <> 7' sostituisci tutti i riferimenti in avanti a' 7' con '1' e viceversa,' 7 <> 8' diventerebbe '1 <> 8' e questi tre valori si troverebbero nel posizioni corrette –