Heapsort-Algorithmus 22.05.2019 Wahlkurs Informatik 11-13 (C) MPohlig 2006
Die Idee des Heapsort-Algorithmus Wann ist ein binärer (Teil)baum heap? Rekursive Definition Wir nennen einen Baum im Knoten i dann heap, wenn die Söhne des Knotens nicht größere Werte haben als i und jeder Teilbaum ab dem Knoten i abwärts selbst wieder heap ist. Ein leerer Teilbaum ist a priori heap. Insbesondere erfüllt ein ganzer Baum die heap-Bedingung, wenn er in der Wurzel heap ist. 22.05.2019 Wahlkurs Informatik 11-13 (C) MPohlig 2006
Die Idee des Heapsort-Algorithmus 22.05.2019 Wahlkurs Informatik 11-13 (C) MPohlig 2006
Die Idee des Heapsort-Algorithmus 22.05.2019 Wahlkurs Informatik 11-13 (C) MPohlig 2006
Die Idee des Heapsort-Algorithmus 22.05.2019 Wahlkurs Informatik 11-13 (C) MPohlig 2006
Die Idee des Heapsort-Algorithmus 22.05.2019 Wahlkurs Informatik 11-13 (C) MPohlig 2006
Die Implementierung des Heapsort-Algorithmus public static void heapSort(int[] liste) { macheHeap(liste); for (int i = liste.length-1; i > 0; i--) { tausche(liste, 0, i); macheHeapFuerKnoten(liste, 0, i-1); } } private static void macheHeap(int[] liste) { for (int i = (liste.length/2); i >= 0; i--) { macheHeapFuerKnoten(liste, i, liste.length-1); } } 22.05.2019 Wahlkurs Informatik 11-13 (C) MPohlig 2006
Die Implementierung des Heapsort-Algorithmus private static void macheHeapFuerKnoten(int[] liste, int dieserKnoten, int heapGroesse) { int linkerSohn = 2 * dieserKnoten + 1; int rechterSohn = linkerSohn + 1; int sohn; if (linkerSohn <= heapGroesse && rechterSohn > heapGroesse) { if (liste[linkerSohn] < liste[dieserKnoten]) tausche(liste, linkerSohn, dieserKnoten); } else { if (rechterSohn <= heapGroesse) { sohn = liste[linkerSohn] < liste[rechterSohn] ? linkerSohn : rechterSohn; if (liste[sohn] < liste[dieserKnoten]) { tausche(liste, dieserKnoten, sohn); macheHeapFuerKnoten(liste, sohn, heapGroesse); } } } } 22.05.2019 Wahlkurs Informatik 11-13 (C) MPohlig 2006