Heapsort • Insertion Sort: Laufzeit O(n2), sortiert inplace, d.h. es werden nur eine konstante Zahl von Elementen ausserhalb des Arrays gespeichert • Merge-Sort: Laufzeit O(n lg n), sortiert nicht in-place • Heapsort: Laufzeit O(n lg n), sortiert in-place Heap-Datenstruktur • Array • kann interpretiert werden als fast vollständiger Binärbaum • alle Reihen des Baumes sind komplett gefüllt, ausser der untersten Heap Datenstruktur Für einen Knoten i gilt: Arten von Heaps • max-heap: Die max-heap Eigenschaft ist, dass für jeden Knoten gilt: A[Parent(i)] ≥ A[i] → der Wurzelknoten enthält das größte Element • min-heap: Die min-heap Eigenschaft ist, dass für jeden Knoten gilt: A[Parent(i)] ≤ A[i] → der Wurzelknoten enthält das kleinste Element • Für den Heapsort-Algorithmus verwenden wir max-heaps. Max-Heapify • Eingabe: Array A und Index i • Annahme: Left(i) und Right(i) sind max-Heaps, A[i] ist möglicherweise kleiner als seine Kinder → max-heap Eigenschaft verletzt • Max-Heapify stellt die max-heap Eigenschaft wieder her: Max-Heapify Effizienz von Max-Heapify • Heap ist ein vollständiger Binärbaum • Ein Binärbaum mit n Elementen hat die Höhe O(lg n) • daher gilt für Max-Heapify: T(n)=O(lg n) Build-Max-Heap • Die Prozedur Build-Max-Heap baut einen max-Heap aus einem Array: Effizienz von Build-MaxHeap • Jeder Aufruf von Max-Heapify benötigt O(lg n) Zeit • Insgesamt gibt es O(n) Aufrufe von MaxHeapify • Laufzeit von Build-Max-Heap daher O(n lg n) Heapsort • • • Nach Build-Max-Heap befindet sich das größte Element in A[1] • heap-size wird um eins reduziert, somit wird das letzte (und nun größte Element) aus dem Heap ausgeblendet • Max-Heapify(A,1) stellt die max-Heap Eigenschaft wieder her wir vertauschen A[1] mit A[n] Danach sind die Kinder von A[1] weiterhin max-Heaps. A[1] verletzt allerdings die max-Heap Eigenschaft Effizienz von Heapsort • Build-Max-Heap benötigt O(n lg n) Zeit • Max-Heapify wird n-1 mal aufgerufen und benötigt jeweils O(lg n) Zeit • Daher ist die Laufzeit von Heapsort T(n)=O(n lg n) Priority Queues • Anwendung:Verwalten von Jobs auf einem multi-user computer • jeder Job hat eine Priorität, derjenige mit der höchsten wird ausgeführt • Insert(S,x) fügt ein Element x der Priority Queue hinzu • Maximum(S) liefert das größte Element • Extract-Max(S) entfernt das größte Element • Increase-Key(S,x,k) ändert den Wert des Elements x zu k. Dabei muss k größer sein, als der aktuelle Wert von x Operationen • Maximum: Laufzeit: O(1) • Extract-Max: Laufzeit: O(lg n) Increase-Key: Laufzeit: O(lg n) Insert: Laufzeit: O(lg n) Fazit: Alle Operationen der Priority Queue werden in O(lg n) Zeit unterstützt