Heap Sort hilfe :(



  • Wo kommt denn das 'n' in heapsort her?



  • Globale variable. Habs grad noch hingeschrieben



  • Also wenn ich in Zeile 31 das max rausnehme und z.B eine 1 reinschreibe kompiliert es. Nur funktioniert dann leider der Algorithmus selbst nicht... weiß nicht was ich da sonst machen soll.



  • Und du hältst es nicht für nötig, die Fehlermeldung des Compilers zu nennen?



  • Würde ich gerne wenn eine käme...
    Er bricht mit "run failed" das kompilieren ab, wie ich sagte. Mehr bekomme ich leider auch nicht



  • Cabooze schrieb:

    Würde ich gerne wenn eine käme...
    Er bricht mit "run failed" das kompilieren ab, wie ich sagte. Mehr bekomme ich leider auch nicht

    Tja, dann solltest du mal die Bedienung deiner IDE lernen. Der Compiler ist ganz sicher nicht so schweigsam.



  • manni66 schrieb:

    Cabooze schrieb:

    Würde ich gerne wenn eine käme...
    Er bricht mit "run failed" das kompilieren ab, wie ich sagte. Mehr bekomme ich leider auch nicht

    Tja, dann solltest du mal die Bedienung deiner IDE lernen. Der Compiler ist ganz sicher nicht so schweigsam.

    Oder wenigstens den Compiler nennen...



  • Warte, gibts einen Compilerfehler oder crasht das Programm?
    Letzteres könnte mit deinen Arraygrenzen zu tun haben. Wenn das Array 10 groß ist, ist das letzte Element 9, nicht 10, <= ist also falsch.
    Deine Nutzung von globalen Variablen ist auch nicht gerade toll...



  • Nathan schrieb:

    Warte, gibts einen Compilerfehler oder crasht das Programm

    Der Code von oben gibt bestimmt einen Compilerfehler, nämlich "undeclared variable(s) line 10+11"..



  • Cabooze schrieb:

    Rekursion bereitet mir oft noch ziemliche Probleme. ...

    an der Rekursion liegt es nicht. Es sind ein paar andere Fehler drin. Anbei die Korrektur:

    // int n = 10;  // <== verzichte ganz auf globale Variablen (nur fehleranfällig)
    // int heapsize;
    
    // 'swap' braucht man öfter, daher auslagern; Alternative wäre: std::swap aus #include <algorithm>
    void swap( int& a, int& b ) {
        int tmp = a;
        a = b;
        b = tmp;
    }
    
    void heapify(int A[], int heapsize, int i) { // nimm 'heapsize' mit in die Parameterliste auf!
        int l = 2 * i + 1;  // 1.) '+1' vergessen; 2.) if(i==0){ <== Fallunterscheidung ist überflüssig 
        int r = l + 1;
    
        int max = i;    // initiale Belegung vergessen
        if(l < heapsize && A[l] > A[i])    // '< size' statt '<= size'
            max = l;
        // else if(l <= heapsize && A[l] < A[i]) // überflüssig und fehlerhaft, da im Fall 'A[l] == A[i]'  max nicht initialisiert wurde
        //    max = i;
        if(r < heapsize && A[r] > A[max])  // 1.) '< size' statt '<= size'; 2.) statt 'A[r] > A[i]', damit der größte(!) Wert nach oben kommt
            max = r;
    
        if(max != i){
            swap( A[i], A[max] );
            heapify(A,heapsize,max);
        }   
    }
    
    void buildheap(int A[], int heapsize){
        for(int i = heapsize/2-1; i>=0; i--){
            heapify(A,heapsize,i);
        }
    }
    
    void heapsort(int A[], int heapsize){
        buildheap(A,heapsize);
    
        for( ; --heapsize > 0; ){
            swap( A[0], A[heapsize] );
            heapify(A,heapsize,0);
        }
    }
    
    int main(int /*argc*/, char** /*argv*/) {
        int B[]={6,5,74,2,19,1,7,88,64,22}; // die '10' war redundant zur Anzahl der Zahlen in der Liste
        heapsort(B, sizeof(B)/sizeof(*B));
        return 0;
    }
    

    Gruß
    Werner


Anmelden zum Antworten