Considera il problema di manipolare un elenco in uno stato diverso in cui conosci lo stato finale.
- Trova ogni "sottografo incluso" più grande di uno (lo spiegherò più avanti).
- Trova la somma delle lunghezze dei sottografi e sottrai il numero di sottografi.
- Esiste la tua risposta per il numero di scambi.
Un "sottografo incluso" è un sottoinsieme minimo dell'intero in cui ogni elemento dell'elenco iniziale si trova anche nell'elenco finale.
Quindi se costruisci un sottografo con gli indici 4,5 e 9 dallo stato iniziale e hanno i valori 10, 20 e 30 allora perché sia un "sottografo incluso", dovresti riuscire a trovare i valori dallo stato finale con gli indici 4, 5 e 9 e quei valori dovrebbero essere 10, 20 e 30 (sebbene non necessariamente in questo ordine).
Considera questo:
a b c d f e
|
v
b a d f c e
Questo ovviamente richiederebbe 3 swap. (a < = > b, c < = > d, c < = > f)
Applicando l'algoritmo sopra, ha:
- 3 "sottografi allegati", ([a, b],
[c, d, f], [e])
- 2 sottografi con più di un elemento ([a, b], [c, d, f])
- Ci sono 5 elementi in tutti quei sottografi
- 5 - 2 == la risposta.
Diventa un po 'più difficile quando vuoi fare il numero minimo di swap per ottenerlo nell'ordine ordinato, tuttavia, non è impossibile.
- Trova l'indice di ordinamento ordinato di ogni elemento nell'elenco, se non vuoi spostare alcun dato, allora questo è n ^ 2 volte.
- Trova i "sottografi allegati".
- Scambia gli elementi nell'elenco per ottenere l'ordine corretto, ma scambia solo gli elementi all'interno dello stesso sottografo.
Quindi spero che tu possa vedere che non è impossibile fare il numero minimo di swap per arrivare all'ordine ordinato, ma non ne vale la pena, perché richiede un numero ridicolo di confronti. Basta usare heapsort.