Sortieren Sie ein Array von Elementen, wenn nur nicht vorhanden ist

8

Ich versuche zu verstehen, wie ich ein Array von Elementen sortieren kann, wenn nur \ log n nicht vorhanden ist.log nnLogn

Ich habe gehört, dass das Sortieren eines Arrays mit höchstens ich Inversionen die Komplexität Ö(nLog(ich/.n)) . Da es Logn Elemente gibt, die nicht sortiert sind, gibt es in meinem Fall höchstens nLogn Inversion.

Die Antwort auf die Frage lautet Ö(nLogLogn) was mit der Formel übereinstimmt, aber ich kann die "Idee dahinter" nicht verstehen oder welcher Sortieralgorithmus dies erreicht.

user64264
quelle

Antworten:

9

Unter der Annahme, dass " Elemente fehl am Platz" bedeutet, dass Elemente vorhanden sind, deren Löschung den Rest des Arrays sortiert, gibt es einen -Zeitalgorithmus, um das gesamte Array zu sortieren.k O ( n + k log k )kkO(n+klogk)

Kurz gesagt, berechnen Sie eine zunehmende Teilfolge mit einer Länge von mindestens , sortieren Sie die anderen und führen Sie sie zusammen. Ersteres kann in der Zeit durch einen einfachen Stapelalgorithmus erreicht werden, der Elemente einzeln pusht und die beiden obersten platziert, wenn sie nicht in Ordnung sind. Die optimale Löschstrategie muss mindestens eines dieser Elemente löschen, damit der Gesamtschaden durch Löschungen erhöht wird .O ( n ) 2 kn2kO(n)2k

David Eisenstat
quelle
+1 für die nette Idee. Nur eine Sache (und ich spalte hier wahrscheinlich die Haare): Können Sie wirklich Einfügungen an beliebigen Stellen vornehmen, ohne die -Kosten "Jeder wechselt bitte nach rechts" zu vermeiden ? Ich glaube, wir sollten die Einfügungen in einer separaten Struktur verfolgen und am Ende einen letzten Durchgang machen, um das sortierte Array zu erzeugen. O(n)
Quicksort
@ Quicksort besser, nur die Fetzen zu sortieren und Methoden zusammenzuführen
David Eisenstat
1
Das ist das Gleiche, aber das Zusammenführen ist sauberer, da stimme ich zu.
Quicksort
1
Erwähnenswert ist, dass dies in Abhängigkeit von n und k asymptotisch optimal ist (unter Verwendung von Vergleichen).
Aelguindy
Nun, der von Ihnen beschriebene Algorithmus scheint eine Drop-Merge-Sortierung zu sein .
Morwenn
5

Angenommen, es gibt nicht vorhandene Elemente.k

Teilen Sie das Array in nicht abnehmende Subarrays auf. Dies kann in -Zeit erfolgen und führt zu höchstens Subarrays. Jetzt führen wir sie nur paarweise in -Zeit zusammen, um ein sortiertes Array zu erhalten.Θ(n)2kΘ(nLogk)

schnelle Sorte
quelle