Mergesort Fehler in der Implementierung

klausr

Mitglied
Guten Abend,

ich habe mich nun auch an einer Mergesort Implementierung versucht, finde jedoch hier ebenfalls den Fehler nicht. Wenn ich die Methode Mergesort aufrufe habe ich im Ergebnisarray nachher mysteriöserweise nur Nullen liegen.
Von der Logik her scheinen mir die Abläufe korrekt. Habe eher die Vermutung, dass es an void / return Methoden liegt?

Es wäre daher sehr nett, wenn mir jemand etwas Hilfestellung bzw. einen Hinweis geben könnte, wo ich mal suchen könnte.

Danke und Gruß

Java:
public class Mergesort {
   
    public static int [] merge(int [] a, int l, int m, int r) {
       
        int [] b = new int[a.length];
       
        int i = l;    // dient zum Durchlaufen von a[l...m]
        int j = m+1;    // dient zum Durchlaufen von a[m+1...r]
        int k = l;    // b[k] ist das nächste Element der Ergebnisfolge
       
        while(i<=m && j<=r) {
            if(a[i] < a[j]) {
                b[k] = a[i];
                i++;
            }
            else {
                b[k] = a[j];
                j++;
            }
            k++;
        }
        if(i>m) { // a[l...m] ist durchlaufen, übernehme Rest von a[m+1...r]
            for(int h=j; h<=r; h++) {
                b[k+h-j] = a[h];
            }
        }
        else { // j>m, a[m+1...r] ist durchlaufen, übernehme Rest von a[l...m]
            for(int h=i; h<=m; h++) {
                b[k+h-i] = a[h];
            }
        }
        // kopieren
        for(int p = 0; p<a.length; p++) {
            a[p] = b[p];
        }
       
        return a;
    }
    public static void Mergesort(int [] a, int l, int r) {
        if(l<r) {
            int m = (l+r)/2;
            Mergesort(a,l,m);
            Mergesort(a,m+1,r);
            merge(a,l,m,r);
        }
    }
    public static void main(String [] args) {
        int [] a = new int[] {1,8,3,9,5,2,10,7,4};
        Mergesort(a,0,a.length-1);
       
        for(int i=0; i<a.length; i++) {
            System.out.print(a[i]);
        }
    }
}
 
In der Methode 'merge' möchtest du nur die Elemente zwischen l und r sortieren, bzw. setzt du nur die Elemente zwischen l und r des b-Arrays. Am Ende durchläufst du allerdings das komplette b-Array und kopierst es ins a-Array, also auch die nicht gesetzten Elemente (also 0) vor l und nach r. Entweder du änderst die Schleifengrenzen entsprechend, oder besser: du erstellst nur ein b-Array der Größe (r-l+1). Dann musst du noch ein bisschen die Indizes fürs b-Array ändern.

lg Kevin
 

Neue Themen


Zurück
Oben