60 likes | 175 Views
Vorlesung Informatik 2 Algorithmen und Datenstrukturen 09 - Weitere Sortierverfahren Heapsort-Nachtrag. Prof. Th. Ottmann. Heapsort. Effizientes Verfahren zum Sortieren (auch im worst case in O( n log n ))
E N D
Vorlesung Informatik 2Algorithmen und Datenstrukturen09 - Weitere SortierverfahrenHeapsort-Nachtrag Prof. Th. Ottmann
Heapsort • Effizientes Verfahren zum Sortieren (auch im worst case in O(n log n)) • Prinzip: Sortieren durch wiederholtes Auswählen des Maximums(ähnlich Selection Sort) • Besonderheit: Verwendung einer Datenstruktur Heap, welche die Bestimmung desMaximums effizient unterstützt Definition.Eine FolgeF = (k1, k2, . . . , kn) von Schlüsseln ist ein (Max-) Heap,wenn für alle i {1, 2, …, n/2} gilt:ki≥ k2iundki≥ k2i+1. Heapsort operiert auf einem Array, das man mithilfe eines vollständigen Baumes veranschaulicht.
4 1 3 7 6 5 2 Veranschaulichung der Heap-Ordnung Veranschaulichung des Heaps durch Binär-Baum mit Positionsnummern: • Level i hat 2i Knoten (außer dem letzten) • Knoten sind von oben nach unten und von links nach rechts nummeriert. • Knoten i hat Knoten 2i als linken und Knoten 2i + 1 als rechten Nachfolger undKnoten i/2 als Vorgänger (falls jeweils vorhanden). Aus der Heap-Bedingung ki≥ k2i und ki≥ k2i+1 folgt: Das Maximum steht an der Wurzel (an Index 1) und kann sofort entfernt werden. 1 1 2 3 4 5 6 77 6 5 2 3 4 1 2 3 4 6 7 5
Heapsort Sortieren mit Hilfe eines Heaps: • Phase 1: Verwandeln des gegebenen Arrays in einen Heap • Phase 2: Iterieretes Extrahieren des Maximums (von Position 1), Tauschen des Elementes mit höchstem Index im nichtsortierten Teil an Position1 und versickern lassen im Rest. Phase 2 wird n-Mal ausgeführt, jede Ausführung kostet höchstens O(log n) Schlüsselvergleiche. Phase 1 kann in Zeit O(n) ausgeführt werden. Gesamtlaufzeit von Heapsort: O(n log n)
Heapaufbau Niveau, #Knoten, Versick.-Aufwand/Knoten
Aufwand für Heapaufbau Gesamtaufwand = 202k + 21 2(k-1) + 22 2(k-2) + … + 2(k-1) 2 = 2 S(k), mit S(k) = 20k + 21(k-1) + 22(k-2) + … + 2(k-1)1 = 2 (n – k – 1) = O(n)