Ich kann nicht verstehen, warum der Heapsort als Inplace- Sortieralgorithmus angesehen wird.
Ich meine, eine zusätzliche Datenstruktur, die mit den Elementen des zu sortierenden Arrays gefüllt ist, dh ein Heap, wird verwendet, um die Extraktion des min-Werts und den Sortiervorgang zu unterstützen.
Kann es sein, dass ich die Definition von Inplace hier falsch verstehe?
Aber Einfügesortierung zum Beispiel ist offensichtlich, dass es sich um einen Inplace-Algorithmus handelt, dh es wird kein zusätzlicher Speicher für die Elemente benötigt.
Warum wird es als vorhanden betrachtet?
quelle
Möglicherweise fehlt Ihnen das grundlegende Verständnis, dass ein Array zum Festlegen des Layouts eines Baums verwendet werden kann.
Angenommen, Sie haben einen Binärbaum und ein innerer Knoten befindet sich am Index i des Arrays. Dann kann der Array-Index des übergeordneten und untergeordneten Elements dieses Knotens wie folgt ermittelt werden:
Sehen:
http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/heapSort.htm
Da der Heap vollständig in einem Array verwaltet und organisiert werden kann, kann Heapsort an Ort und Stelle ausgeführt werden, indem Elemente innerhalb des Eingabearrays verschoben werden. In der Tat wird der Heap mithilfe des ursprünglichen Eingabearrays erstellt und bearbeitet.
quelle
Wenn man, wie Sie sagen, wirklich eine zusätzliche Struktur benötigt, um den Heap zu erstellen, dann wäre heapsort in der Tat KEIN Inplace-Sortieralgorithmus.
Dies ist jedoch nicht der Fall. Sie können den Heap auf demselben Array erstellen, das Sie sortieren möchten, und anschließend den Heapsort-Algorithmus anwenden, sodass er an Ort und Stelle sortiert wird.
quelle
Wikipedia - In-Place-Algorithmus
quelle
Es wird als vorhanden betrachtet, da der Platzbedarf vernachlässigbar ist (konstant oder überhaupt nicht, wenn Sie bitweise Operationen zum Austauschen von Elementen verwenden). MergeSort ist beispielsweise nicht vorhanden, da die Eingabemenge nicht bei jeder Iteration des Suchbeispiels geändert wird.
Der beste Weg, um die Unterschiede zwischen In-Place-Algorithmen und Out-Of-Place-Algorithmen zu veranschaulichen, besteht wahrscheinlich darin, den folgenden C / C ++ - String-Umkehrcode zu betrachten, der dies ausführt (von K & R):
Wenn Sie beispielsweise die Eingabezeichenfolge vom Ende aus lesen und die Zeichen in einem anderen Puffer ablegen würden, wäre dies ein fehl am Platz befindlicher Algorithmus zur Umkehrung der Zeichenfolge.
quelle