Auswählen nach Rang (Selektion)

Ähnliche Dokumente
Heapsort. Ziel: Sortieren Feld A[1..n]von nschlüsseln in O(n log n)worst case Zeit(so wie Mergesort), aber ohne Zusatzspeicher(so wie Quicksort).

Korollar: Jeder vergleichsbasiertealgorithmus zum Sortieren von n Schlüsseln hat im schlechtesten Fall Laufzeit

Sortieren II / HeapSort Heaps

Kap. 3: Sortieren (3)

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Heaps. Vorlesung 8: Heapsort (K6) Joost-Pieter Katoen. 7. Mai 2015

Algorithmen und Datenstrukturen Heapsort

14. Sortieren II Heapsort. Heapsort. [Max-]Heap 7. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Kapitel 2. Weitere Beispiele Effizienter Algorithmen

8. Sortieren II. 8.1 Heapsort. Heapsort. [Max-]Heap 6. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Heapsort, Quicksort, Mergesort. 8. Sortieren II

Algorithmen und Datenstrukturen (für ET/IT)

Heapsort, Quicksort, Mergesort. 8. Sortieren II

Kap. 3 Sortieren. 7. VO DAP2 SS Mai Vorlesung am Do 7.5. entfällt wegen FVV um 14 Uhr HeapSort ff 3.1.

3.2. Divide-and-Conquer-Methoden

Grundlagen der Algorithmen und Datenstrukturen Kapitel 6

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

Heapsort / 1 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8]

Heapsort. Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen / 50

Programmiertechnik II

Grundlagen: Algorithmen und Datenstrukturen

Proseminar Effiziente Algorithmen

Algorithmen und Datenstrukturen II

Grundzüge DS & Alg (WS14/15) Lösungsvorschlag zu Aufgabenblatt 3. Aufgabe 1. (a) nicht-heap (b) Heap 25. (c) Beinahe-Heap 9.

Suchen und Sortieren Sortieren. Heaps

Informatik II, SS 2018

Algorithmen und Datenstrukturen

Copyright, Page 1 of 7 Heapsort

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

Kapitel 8 Fortgeschrittene Sortieralgorithmen

9. Natürliche Suchbäume

Algorithmen und Datenstrukturen

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

Termine für Übungstests. Kap. 3 Sortieren HeapSort ff Priority Queues. Motivation. Überblick. Analyse SiftDown

8.1.3 Operation Build-Max-Heap Operation zur Konstruktion eines Heaps Eingabe: Feld A[1..n], n = länge(a) BUILD-MAX-HEAP (A)

Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

Definition Ein Heap (priority queue) ist eine abstrakte Datenstruktur mit folgenden Kennzeichen:

Datenstrukturen und Algorithmen Beispiellösung zu Heimübungsblatt 7. Abbildung 1: Das Array A als Baum (vgl. Foliensatz 16, Folie 3)

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.2 Quicksort. A7.

Präsenzübung Datenstrukturen und Algorithmen SS 2014

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Suchen. Lineare Suche. Such-Algorithmen. Sommersemester Dr.

Technische Universität München

Algorithmen und Datenstrukturen

Datenstrukturen & Algorithmen

Algorithmen und Datenstrukturen

Algorithmen I - Tutorium 28 Nr. 7

18. Natürliche Suchbäume

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

Abschnitt 19: Sortierverfahren

Vorlesung Datenstrukturen

EINI LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

Algorithmen und Datenstrukturen SoSe 2008 in Trier. Henning Fernau Universität Trier

Asymptotische Laufzeitanalyse: Beispiel

Algorithmen und Datenstrukturen. Bäume. M. Herpers, Y. Jung, P. Klingebiel

Datenstrukturen und Algorithmen. 7. Suchen in linearen Feldern

Denition: Rang eines Elements e einer Folge s = Position von e in sort(s) (angefangen bei 1). Frage: warum ist r nicht notwendig eindeutig?

Definition 77 Sei n N. Der Median (das mittlere Element) einer total geordneten Menge von n Elementen ist deren i-kleinstes Element, wobei n i =.

Algorithmen und Programmieren II

Informatik II, SS 2014

Übung Algorithmen und Datenstrukturen

7. Sortieren Lernziele. 7. Sortieren

Abschnitt: Algorithmendesign und Laufzeitanalyse

Informatik II, SS 2016

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Suchverfahren Autor: Stefan Edelkamp / Sven Schuierer

Heapsort. 1. Erstelle aus dem gegebenen Array einen Max-Heap (DownHeap) 2. Tausche erstes und letztes Element des Arrays

lim log 2n n = > 0 Da es einen Limes gibt, gibt es auch einen Limes inferior, der gleich diesem Limes ist.

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

EINI LW/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 16/17

2. Algorithmische Methoden 2.1 Rekursion. 18. April 2017

Informatik II, SS 2016

5. Vorrangwarteschlangen (priority queues)

Heapsort. Erstellung eines Heaps

Heapsort. 1. Erstelle aus dem gegebenen Array einen Heap (DownHeap) 2. Tausche erstes und letztes Element des Arrays

in eine Folge ai, so daß bezgl. einer Ordnung gilt: a a, j < n

Algorithmen I. Prof. Jörn Müller-Quade Institut für Theoretische Informatik Web:

Datenstrukturen & Algorithmen

5. Vorrangwarteschlangen - Priority Queues

Algorithmen und Datenstrukturen

3. Suchen. Das Suchproblem. Suche in Array. Lineare Suche. 1 n. i = n Gegeben Menge von Datensätzen.

Übung Algorithmen und Datenstrukturen

Dr. Lars Hildebrand Fakultät für Informatik Technische Universität Dortmund

Vorlesung Datenstrukturen

Proseminar Effiziente Algorithmen

Kurs 1663 Datenstrukturen" Musterlösungen zur Klausur vom Seite 1. Musterlösungen zur Hauptklausur Kurs 1663 Datenstrukturen 15.

Informatik II Prüfungsvorbereitungskurs

1.3 Erinnerung: Mergesort

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

Natürliche Bäume. (Algorithmen und Datenstrukturen I) Prof. Dr. Oliver Braun. Letzte Änderung: :16. Natürliche Bäume 1/16

Algorithmen II Vorlesung am

Übungsklausur Algorithmen I

Ein sortiertes Feld kann in O(log n) durchsucht werden, z.b. mit Binärsuche. Der Algorithmus 1 gibt den Pseudocode der binären Suche an.

Dynamische Datenstrukturen

Algorithmen & Komplexität

Transkript:

Auswählen nach Rang (Selektion) Geg.: Folge X von n Schlüsseln, eine Zahl k mit k n Ges.: ein k-kleinster Schlüssel von X, also den Schlüssel x k für X sortiert als x x 2 L x n trivial lösbar in Zeit O(kn) (k mal Minimum Entfernen), oder auch in Zeit O(n log n) (Sortieren) Ziel: O(n) Zeit Algorithmus für beliebiges k (z.b. auch k=n/2, "Median von X") Vereinfachende Annahme für das Folgende: alle Schlüssel in X sind verschieden, also für sortiertes X gilt x <x 2 < L < x n Übung: Adaptieren Sie die folgenden Algorithmen, sodass diese Annahme nicht notwendig ist und die asymptotischen Laufzeiten erhalten bleiben. GZ Algorithmen und Datenstrukturen 3.0.203 Geg.: Folge X von n Schlüsseln, eine Zahl k mit k n Ges.: ein k-kleinster Schlüssel von X, also den Schlüssel x k für X sortiert als x x 2 L x n Dezimiere! Wähle irgendein z2x und berechne X <z = {x2x x<z} und X >z ={x2x x>z} (z.b. durch Partitionsfunktion aus der letzten Vorlesung) Es gilt dann z=x h mit h- = X <z. < z z > z h- n-h Fall h=k: ) z ist das gesuchte x k Fall h>k: ) x k liegt in X <z und ist darin der k-kleinste Schlüssel (X >z ist irrelevant) Fall h<k: ) x k liegt in X >z und ist darin der (k-h)-kleinste Schlüssel (X <z ist irrelevant) Also x k wird bei gegebenem z entweder sofort gefunden, oder man kann es rekursiv in X <z oder X >z finden. Welcher Fall für gewähltes z eintritt ist a priori nicht bekannt. Es wäre also günstig, wenn sowohl X <z als auch X >z "wenig" Schlüssel enthalten. GZ Algorithmen und Datenstrukturen.0.203

Sei ½ < a <: Wir nennen z2x einen a-guten Splitter für X, wenn sowohl X <z a X als auch X >z a X gilt. Algorithmus zum Finden des k-kleinsten Schlüssel in X (bei festgelegtem a) Select( X, k ). If X klein (z.b. X 50) then verwende eine triviale Methode. 2. Finde einen a-guten Splitter z2x für X 3. Berechne X <z = {x2x x<z} und X >z ={x2x x>z} und bestimme h = X <z +. 4. If h=k then return z else if h>k then return Select( X <z, k ) else (* h<k *) return Select( X >z, k-h ) Laufzeitanalyse: T(n) Laufzeit von Select( X, k ), wobei n= X S a (n) (erwartete) Laufzeit um a-guten Splitter zu finden. a n für eine Konstante a 2. S a (n) 3. c n für eine Konstante c 4. T(an) T(n) a n wenn n 50 T(n) c n + S a (n) + T(an) wenn n>50 GZ Algorithmen und Datenstrukturen 3 3.0.203 Wie findet man einen a-guten Splitter für X? Methode : Randomisiert Ziehe ein zufälliges Element z von X und bestimme die Größen von X <z und X >z und bestimme so, ob z ein a-guter Splitter ist. ( Zeit O(n) ) Wiederhole dies, bis ein a-guter Splitter gefunden ist. Die (-a)n kleinsten Schlüssel in X sind keine a-guten Splitter, weil sonst X >z zu groß Die (-a)n größten Schlüssel in X sind keine a-guten Splitter, weil sonst X <z zu groß Es gibt also n 2( a)n = (2a )n = bn viele a-gute Splitter. Chance, zufällig gezogenes z ein a-guter Splitter, ist b. Die erwartete Anzahl von Wiederholungen, bis ein a-guter Splitter gefunden wird, ist also /b. Für die erwartete Laufzeit, um einen a-guten Splitter zu finden, gilt S a (n) = ( /b ) O(n) b a n für irgendeine Konstante b a. GZ Algorithmen und Datenstrukturen 4 3.0.203

Sei ½ < a <: Wir nennen z2x einen a-guten Splitter für X, wenn sowohl X <z a X als auch X >z a X gilt. Laufzeitanalyse: T(n) Laufzeit von Select( X, k ), wobei n= X S a (n) (erwartete) Laufzeit um a-guten Splitter zu finden T(n) a n wenn n 50 T(n) c n + S a (n) + T(an) wenn n>50 Methode : S a (n) b a n T(n) a n wenn n 50 T(n) c n + b a n + T(an) = C a n + T(an) wenn n>50 ) T(n) B a n / (-a) = O(n) mit B a = max{ a, C a } mit Induktion Auswahl nach Rang kann in O(n) erwarteter Laufzeit gelöst werden. GZ Algorithmen und Datenstrukturen 5 3.0.203 Wie findet man einen a-guten Splitter für X? Methode 2: Deterministisch (Blum, Floyd, Pratt, Rivest, Tarjan) für a = 7/0 i) Teile X in n/5 Gruppen zu je 5 Schlüssel auf ii) Bestimme für jede 5-er Gruppe den Median (3.-kleinsten Schlüssel) iii) Verwende verschränkt rekursiv Select() um den Median z dieser n/5 Mediane zu bestimmen Behauptung: z ist ein a-guter Splitter für a = 7/0. Beweis: eine Hälfte der 5er-Gruppen (die mit den Medianen z ) enthält jeweils mindestes 3 Schlüssel größer als z. ) es gibt mindestens 3 (n/5)/2 = (3/0)n Schlüssel größer als z ) X >z (3/0)n ) X <z (7/0)n eine Hälfte der 5er-Gruppen (die mit den Medianen z ) enthält jeweils mindestes 3 Schlüssel kleiner als z. ) es gibt mindestens 3 (n/5)/2 = (3/0)n Schlüssel kleiner als z ) X <z (3/0)n ) X >z (7/0)n GZ Algorithmen und Datenstrukturen 6 3.0.203

Wie findet man einen a-guten Splitter für X? Methode 2: Deterministisch (Blum, Floyd, Pratt, Rivest, Tarjan) für a = 7/0 i) Teile X in n/5 Gruppen zu je 5 Schlüssel auf ii) Bestimme für jede 5-er Gruppe den Median (3.-kleinsten Schlüssel) iii) Verwende verschränkt rekursiv Select() um den Median z dieser n/5 Mediane zu bestimmen Behauptung: z ist ein a-guter Splitter für a = 7/0. Laufzeit: Median einer 5-er Gruppe Bestimmen braucht konstant viel Zeit, O(). ) Schritt ii) braucht (n/5) O() = O(n) Zeit. Schritt i) brauch O(n) Zeit Schritt iii) braucht T(n/5) Zeit ) S a (n) D n + T(n/5) für irgendeine Konstante D, wobei a = 7/0. GZ Algorithmen und Datenstrukturen 7 3.0.203 Sei ½ < a <: Wir nennen z2x einen a-guten Splitter für X, wenn sowohl X <z a X als auch X >z a X gilt. Laufzeitanalyse: T(n) Laufzeit von Select( X, k ), wobei n= X S a (n) (erwartete) Laufzeit um a-guten Splitter zu finden T(n) a n wenn n 50 T(n) c n + S a (n) + T(an) wenn n>50 ) S a (n) D n + T(n/5) für irgendeine Konstante D, wobei a = 7/0. T(n) a n wenn n 50 T(n) c n + D n + T((/5)n) + T((7/0)n) = (c+d) n + T((/5)n) + T((7/0)n) wenn n>50 ) T(n) 0E n = O(n) mit E = max{ a, c+d } mit Induktion Auswahl nach Rang kann in O(n) worst case Laufzeit gelöst werden. GZ Algorithmen und Datenstrukturen 8 3.0.203

Heapsort Ziel: Sortieren Feld A[..n] von n Schlüsseln in O(n log n) worst case Zeit (so wie Mergesort), aber ohne Zusatzspeicher (so wie Quicksort). Abstrakte Speichere die Schlüssel in A[] in den ersten n Knoten eines binären Baumes und nutze die Struktur diese Baumes Bsp: A = h 9, 6,4, 7, 5, 3, 8, 9, 2, 27, 24, 20, 22 i mit n = 3 GZ Algorithmen und Datenstrukturen 9 3.0.203 Bsp: A = h 9, 6,4, 7, 5, 3, 8, 9, 2, 27, 24, 20, 22 i mit n = 3 8 9 0 4 5 6 7 die ersten 3 Knoten (in Niveau-Ordnung) des unendlichen binären Baumes GZ Algorithmen und Datenstrukturen 0 3.0.203

Bsp: A = h 9, 6,4, 7, 5, 3, 8, 9, 2, 27, 24, 20, 22 i mit n = 3 9 6 4 7 5 3 8 9 2 27 24 20 22 8 9 0 4 5 6 7 A[..3] in diesen ersten 3 Knoten des unendlichen binären Baumes GZ Algorithmen und Datenstrukturen 3.0.203 27 24 22 9 6 20 8 7 2 9 5 3 4 8 9 0 4 5 6 7 Umgestellt in Max-Heap. d.h. für jeden Knoten v gilt die Max-Heap Eigenschaft: sein Schlüssel ist zumindest so groß wie der jedes seiner Kinder ( für jedes Kind c von v gilt: key(v) key(c) ) Beachte: In Max-Heap steht der größte Schlüssel immer bei der Wurzel. GZ Algorithmen und Datenstrukturen.0.203

Beachte: In Max-Heap steht der größte Schlüssel immer bei der Wurzel. 27 24 22 9 6 20 8 7 2 9 5 3 4 8 9 0 4 5. Tausche Schlüssel von und und ziehe aus der Betrachtung GZ Algorithmen und Datenstrukturen 3 3.0.203 4 24 22 9 6 20 8 7 2 9 5 3 27 8 9 0 4 5. Tausche Schlüssel von und und ziehe aus der Betrachtung GZ Algorithmen und Datenstrukturen 4 3.0.203

4 24 22 9 6 20 8 7 2 9 5 3 27 8 9 0 4 5. Tausche Schlüssel von und und ziehe aus der Betrachtung 2. Mache den "Beinahe-Max-Heap" (die Max-Heap-Eigenschaft ist bei der Wurzel verletzt) zu einem Max-Heap GZ Algorithmen und Datenstrukturen 5 3.0.203 24 9 22 2 6 20 8 7 4 9 5 3 27 8 9 0 4 5. Tausche Schlüssel von und und ziehe aus der Betrachtung 2. Mache den "Beinahe-Max-Heap" (die Max-Heap-Eigenschaft ist bei der Wurzel verletzt) zu einem Max-Heap GZ Algorithmen und Datenstrukturen 6 3.0.203

24 9 22 2 6 20 8 7 4 9 5 3 27 8 9 0 4 5. Tausche Schlüssel von und und ziehe aus der Betrachtung 2. Mache den "Beinahe-Max-Heap" (die Max-Heap-Eigenschaft ist bei der Wurzel verletzt) zu einem Max-Heap Der größte Schlüssel steht nun am Schluss. Der betrachtete, um eins kleinere Max-Heap enthält nur kleinere Schlüssel. Diese müssen nun sortiert werden. Dieses Sortieren kann durch Wiederholen der eben verwendeten Methode geschehen GZ Algorithmen und Datenstrukturen 7 3.0.203 3 9 22 2 6 20 8 7 4 9 5 24 27 8 9 0 4 5. Tausche Schlüssel von und und ziehe aus der Betrachtung GZ Algorithmen und Datenstrukturen 8 3.0.203

9 6 22 2 9 20 8 7 4 3 5 24 27 8 9 0 4 5. Tausche Schlüssel von und und ziehe aus der Betrachtung 2. Mache den "Beinahe-Max-Heap" (die Max-Heap-Eigenschaft ist bei der Wurzel verletzt) zu einem Max-Heap GZ Algorithmen und Datenstrukturen 9 3.0.203 9 6 22 2 9 20 8 7 4 3 5 24 27 8 9 0 4 5. Tausche Schlüssel von und und ziehe aus der Betrachtung 2. Mache den "Beinahe-Max-Heap" (die Max-Heap-Eigenschaft ist bei der Wurzel verletzt) zu einem Max-Heap Der größte Schlüssel steht nun am Schluss. Der betrachtete, um eins kleinere Max-Heap enthält nur kleinere Schlüssel. Diese müssen nun sortiert werden. Dieses Sortieren kann durch Wiederholen der eben verwendeten Methode geschehen GZ Algorithmen und Datenstrukturen 20 3.0.203

Heapsort(A,n) makeheap(a,n) while do swap( key(), key() ) heapify( ) Brauchen:. Implementierung von heapify() 2. Implementierung von makeheap() 3. konkrete Realisierung des darunterliegenden binären Baumes GZ Algorithmen und Datenstrukturen.0.203 Heapsort(A,n) makeheap(a,n) while do swap( key(), key() ) heapify( ) Brauchen:. Implementierung von heapify() 2. Implementierung von makeheap() 3. konkrete Realisierung des darunterliegenden binären Baumes Achtung: statt "heapify" wird auch of der Ausdruck "sift-down" verwendet. GZ Algorithmen und Datenstrukturen 2.0.203

heapify( v ) soll aus einem Beinahe-Max-Heap mit Wurzel v einen Max-Heap machen heapify( v ) Die Kinder von v sind Wurzeln von Max-Heaps, aber bei v ist die Max-Heap-Bedingung möglicherweise nicht erfüllt Bestimme Kind maxc von v mit größtem Schlüssel. Falls dieser größer als der von v, dann vertausche die Schlüssel. Damit ist die Max-Heap-Bedingung zwischen v und seinen Kindern erfüllt, aber maxc ist möglicherweise jetzt Wurzel eines Beinahe- Max-Heaps. Also dort Rekursion. if not is-leaf( v ) then maxc = leftchild( v ) if exists( rightchild( v ) ) then if key( rightchild(v) ) > key( leftchild( v ) ) then maxc = rightchild( v ) if key( maxc ) > key( v ) then swap( key( v ), key( maxc ) ) heapify( maxc ) Zeitverbrauch: 2 Schlüsselvergleiche plus O() Zeit pro Level. Insgesamt O(h v ) Zeit, mit h v die Höhe des Teilbaums mit Wurzel v. In den Bäumen die wir betrachten gilt für jeden Knoten v, dass h v b log 2 n c. Also Zeitverbrauch O(log n) GZ Algorithmen und Datenstrukturen 23 3.0.203 Heapsort(A,n) makeheap(a,n) while do swap( key(), key() ) heapify( ) Brauchen:. Implementierung von heapify() 2. Implementierung von makeheap() 3. konkrete Realisierung des darunterliegenden binären Baumes GZ Algorithmen und Datenstrukturen 24 3.0.203

makeheap( A, n ) soll aus den ersten n Knoten des Baumes einen Heap machen. Betrachte einen Baumknoten nach dem anderen. Wenn Knoten v betrachtet wird, sollen die Kinder schon Wurzeln von Heaps sein. Dann kann heapify( v ) verwendet werden, um den Beinahe-Max-Heap mit Wurzel v zu einem Max-Heap zu machen. Die Kinder des betrachteten v sind schon Wurzeln von Max-Heaps, wenn die Betrachtungsreihenfolge rückwärts, also von bis zur Wurzel verwendet wird. (Beim Vater von zu beginnen reicht auch.) makeheap( A, n ) for v from parent() downto do heapify( v ) Zeitverbrauch: v O(h v ) Das ist sicherlich in O(n log n). Es ist sogar in O(n) (Übung!) GZ Algorithmen und Datenstrukturen 25 3.0.203 Heapsort(A,n) makeheap(a,n) while do swap( key(), key() ) heapify( ) Brauchen:. Implementierung von heapify() 2. Implementierung von makeheap() 3. konkrete Realisierung des darunterliegenden binären Baumes GZ Algorithmen und Datenstrukturen 26 3.0.203

Implizite Realisierung des gewünschten Binärbaums im Feld A[..n] 9 6 4 7 5 3 8 9 2 27 24 20 22 8 9 0 4 5 6 7 Abstrakt Realisierung Knoten v Index v ( v n) key(v) A[v] n leftchild(v) 2 v rightchild(v) 2 v+ parent(v) b v/2 c exists(v) (v n) is-leaf(v) (v > n/2) GZ Algorithmen und Datenstrukturen 27 3.0.203 Konkrete Implementierung von Heapsort Heapsort(A,n) makeheap(a,n) while n do swap( A[], A[n] ) n heapify( ) Laufzeit: O(n) für makeheap() O(n log n) für Loop Gesamtlaufzeit: O(n log n) heapify( v ) if v n/2 then maxc = 2 v if 2 v+ n then if A[2 v+] > A[2 v] then maxc = 2 v+ if A[maxc] > A[v] then swap( A[v], A[maxc] ) heapify( maxc ) makeheap( A, n ) for v from b n/2 c downto do heapify( v ) GZ Algorithmen und Datenstrukturen 28 3.0.203