[Java] Heapsort

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von DeLiCioUz, 21. Juni 2010 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 21. Juni 2010
    Heapsort

    Ich hoffe hier kennt sich jemand damit aus.

    Habe heute einen Heapsort programmiert und vorhin gemerkt das ich noch einen Fehler in der Heap-Datenstruktur hab. Finde leider seit Stunden den Fehler nicht. Hier erstmal die Klasse HEap und meine Testklasse:

    Spoiler
    HTML:
    public class Heap<E extends Comparable<E>> {
    
     private E[] a; // Array für Heap und Ergebnisliste
     int wurzel = 0; // Wurzelknoten des Heaps
     int lastHeap = -1; // letzter Knoten des Heaps
    
     // public Get-Methode fürs Array
     public E[] getA() {
     return a;
     }
    
     // Konstruktor 1 - erzeugt leeren Heap mit Länge len
     public Heap(int len) {
     a = (E[]) new Comparable[len];
     }
    
     // Konstruktor 2 - erzeugt Heap aus Parameter-Array
     public Heap(E[] b) {
     a = b;
     lastHeap = a.length-1;
     buildHeap();
     }
    
     // fügt Element ein und stellt Heapordnung wieder her
     public void insert(E e) {
     lastHeap++;
     a[lastHeap] = e;
     upHeap(lastHeap);
     }
    
     // verschiebt Element nach oben, bis Heapordnung hergestellt
     protected void upHeap(int i) {
     while (i > 0 && isGreaterThan(i, vater(i))) {
     swap(i, vater(i));
     i = vater(i);
     }
     }
    
     // stellt Heapordnung für kompletten Heapbaum her
     protected void buildHeap() {
     int k = (lastHeap-1)/2;
     while (k != -1) {
     heapify(k);
     k--;
     }
     }
    
     // stellt Heapordnung für Teilbaum mit Wurzel i her
     protected void heapify(int i) {
     while (i != -1)
     i = heapifyLocally(i);
     }
    
     // stellt Heapordnung für Knoten mit Wurzel i her
     protected int heapifyLocally(int i) {
     int m = maxKind(i);
     if (isGreaterThan(m, i)) {
     swap(m,i);
     return m;
     }
     else return -1; 
     }
    
     // entfernt das größte Element und stellt Heapordnung her
     public E extractMax() {
     E max = a[wurzel];
     a[wurzel] = a[lastHeap];
     lastHeap--;
     heapify(wurzel);
     return max;
     }
    
     // prüft ob Heap leer ist
     protected boolean heapEmpty() {
     return lastHeap == -1;
     }
    
     // liefert Index für linken Sohn
     protected int links(int i) {
     return 2*i + 1;
     }
    
     // liefert Index für rechten Sohn
     protected int rechts(int i) {
     return 2*i + 2;
     }
    
     // liefert Index für Vaterknoten
     protected int vater(int i) {
     return (i-1) / 2;
     }
    
     // liefert Index des größten Sohnknotens
     protected int maxKind(int i) {
     if (isGreaterThan(links(i), rechts(i)))
     return links(i);
     else if (isGreaterThan(rechts(i), links(i)))
     return rechts(i);
     else return i;
     }
    
     // prüft ob Knoten i größer ist als Knoten j
     protected boolean isGreaterThan(int i, int j) {
     if (i <= lastHeap && j <= lastHeap)
     return (a[j].compareTo(a[i]) < 0);
     else return false;
     }
    
     // vertauscht die Inhalte der Knoten i und j
     protected void swap(int i, int j) {
     E tmp = a[i];
     a[i] = a[j];
     a[j] = tmp;
     }
    
     // gibt gesamten Heapinhalt als String zurück
     public String toString() {
     StringBuffer s = new StringBuffer();
     for (int i = 0; i <= lastHeap; i++) {
     s.append(a[i].toString() + " ");
     }
     return "[ " + s + "]"; 
     }
    }
    
    HTML:
    
    public class HeapTest {
     
     public static void main (String[] args) {
     
     System.out.println("HEAP-TEST \n" +
     "---------------------\n");
     
     
     // Konstruktor 1 - INSERT
     Heap h1 = new Heap(10);
     for (int i = 1; i != 11; i++) {
     h1.insert(i);
     }
     System.out.println("Ausgabe Heap 1 - Insert");
     System.out.println(h1.toString());
     System.out.println();
     
     // Konstruktor 2 - BUILDHEAP
     Comparable[] c = {1,2,3,4,5,6,7,8,10,9};
     Heap h2 = new Heap(c);
     System.out.println("Ausgabe Heap 2 - BuildHeap");
     System.out.print(h2.toString());
     System.out.println("\n");
     
     // Konstruktor 1 - Extract Max 
     System.out.println("Heap 1 - ExtractMax");
     System.out.print("Heapgrösse: " + (h1.lastHeap+1) + " Elemente\n[ ");
     for (int i = 0; i < h1.getA().length; i++) {
     System.out.print(h1.extractMax() + " ");
     }
     System.out.println("]\n");
     
     // Konstruktor 2 - Extract Max
     System.out.println("Heap 2 - ExtractMax");
     System.out.print("Heapgrösse: " + (h2.lastHeap+1) + " Elemente\n[ ");
     for (int i = 0; i < h2.getA().length; i++) {
     System.out.print(h2.extractMax() + " ");
     }
     System.out.println("]\n");
     }
    }
    

    Das Problem liegt beim 2. Konstruktor bzw irgendwo im buildHeap-Algo, wenn ich in der Testklasse die Zahlen 1-9 ins Array packe ist alles ok, pack ich mehr Zahlen rein passiert das:

    Code:
    Ausgabe Heap 1 - Insert
    [ 10 9 6 7 8 2 5 1 4 3 ]
    
    Ausgabe Heap 2 - BuildHeap
    [ 10 8 7 4 5 6 3 2 1 [COLOR="Red"]9[/COLOR] ]
    
    Heap 1 - ExtractMax
    Heapgrösse: 10 Elemente
    [ 10 9 8 7 6 5 4 3 2 1 ]
    
    Heap 2 - ExtractMax
    Heapgrösse: 10 Elemente
    [ 10 9 8 7 6 5 4 3 2 1 ]
    Ich krieg die letzte Zahl einfahc nicht heapgeordnet, vielleicht sieht ja jemand den Fehler...werd langsam weich davon
     
  2. 21. Juni 2010
    AW: Heapsort

    puh, hab den fehler gefunden... es fehlte in maxKind diese Abfrage:

    HTML:
     else if (links(i) <= lastHeap && rechts(i) > lastHeap)
     return links(i);
     
  3. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.