No, non è possibile, anche se il mio lavoro sarebbe molto più semplice se fosse :).
Hai un fattore O (log n) che non puoi evitare. Puoi scegliere di prenderlo come tempo o spazio, ma l'unico modo per evitarlo è non ordinare. Con lo spazio O (log n) puoi creare un elenco di continuazioni che tiene traccia di dove hai nascosto gli elementi che non si adattano perfettamente. Con la ricorsione, questo può essere fatto per adattarsi all'heap di O (1), ma solo usando i frame di stack O (log n).
Ecco l'avanzamento di unire le quote e le differenze da 1 a 9.Si noti come si richiede la contabilità dello spazio di log per tracciare le inversioni dell'ordine causate dai vincoli gemelli dello spazio costante e degli scambi lineari.
. -
135792468
. -
135792468
: .-
125793468
: .-
123795468
#.:-
123495768
:.-
123459768
.:-
123456798
.-
123456789
123456789
Ci sono alcune condizioni al contorno delicato, leggermente più difficile della ricerca binaria per ottenere il diritto, e anche di questo modulo (possibile), e quindi un problema compiti cattiva; ma un vero esercizio mentale.
Aggiornamento A quanto pare mi sbaglio e non v'è un algoritmo che fornisce O (n) e O (1) spazio. Ho scaricato i documenti per illuminarmi e ritirare questa risposta come errata.
La domanda specifica specificamente merge-sort? So che è possibile unire ordinamento sul posto, ma non nel tempo O (n) (almeno non ne ho mai sentito parlare.) – jrista
No, non lo è. Sto facendo l'analogia con il passo di unione. Sembra simile. – Sid
Se hai pubblicato il testo esatto della domanda, non sembra che abbia nulla a che fare con un mergesort. Esistono algoritmi di ordinamento che sono O (1) spazio e O (n) in-place per un array pre-ordinato (ad esempio l'inserimento di ordinamento). Il Mergesort non è uno di questi, ed è risaputo che non è uno di questi, quindi ... – jrista