Hilfe bei MergeSort

HansSchmitz91

Grünschnabel
Hallo ich bin das erste mal hier.
Ich hab versucht MergeSort zu programmieren bekomme aber immer wieder einen Fehler, deshalb wollte ich fragen ob ihr euch meinen Quellcode mal anschauen könntet und mir sagen könnt was falsch ist:

Code:
import java.util.Random;
public class MergeSort
{
    
    public static void zerlege(int[] liste, int l, int r)
    {
        if(l < r)
        {
            int m = (l+r)/2;
            zerlege(liste, l, m);
            zerlege(liste, m+1, r);
            sortiere(liste, l, m, r);
        }
    }
    
    public static int[] sortiere(int[] liste, int l, int m , int r)
    {
        int[] dummy = new int[r];
        int j = m + 1;
        int i = l;
        int k = l;
        
        for(int z = i ; z <= r ; z++)
        {
            dummy[z] = liste[z];
        }
        
        while(i <= m && j <= r)
        {
            if(dummy[i] <= dummy[j])
            {
                liste[k] = dummy [i];
                k++;
                i++;
            }
            else
            {
                liste[k] = dummy [j];
                k++;
                i++;
            }
        }
        
        while(i <= m)
        {
            liste[k] = dummy[i];
            k++;
            i++;
        }
        
        return liste;
    }
    
    public static void main(int laenge) 
    {
            Random zufall = new Random();
            int[] liste = new int[laenge];
            
            
            for(int i = 0 ; i < liste.length ; i++)
            {
                liste[i] = zufall.nextInt(laenge*laenge);
                
            }
           
            
            
            zerlege(liste, 0, laenge-1);
            
            
            for (int i=0; i<liste.length; i++)
            {
                System.out.print(liste[i]+" ");
            }
            System.out.println(" ");
            
    }

}
 
Hallo HansSchmitz1991

Es wäre freundlich, wenn du uns nicht Compiler spielen lässt und uns den Fehler mitteilen könntest.

Ausserdem Code bitte mit Codetags versehen:

[code=java]
// dein Code
[/code]


Viele Grüsse
Cromon
 
Java:
import java.util.Random;
public class MergeSort
{

public static void zerlege(int[] liste, int l, int r)
{
if(l < r)
{
int m = (l+r)/2;
zerlege(liste, l, m);
zerlege(liste, m+1, r);
sortiere(liste, l, m, r);
}
}

public static int[] sortiere(int[] liste, int l, int m , int r)
{
int[] dummy = new int[r];
int j = m + 1;
int i = l;
int k = l;

for(int z = i ; z <= r ; z++)
{
dummy[z] = liste[z];
}

while(i <= m && j <= r)
{
if(dummy[i] <= dummy[j])
{
liste[k] = dummy [i];
k++;
i++;
}
else
{
liste[k] = dummy [j];
k++;
i++;
}
}

while(i <= m)
{
liste[k] = dummy[i];
k++;
i++;
}

return liste;
}

public static void main(int laenge) 
{
Random zufall = new Random();
int[] liste = new int[laenge];


for(int i = 0 ; i < liste.length ; i++)
{
liste[i] = zufall.nextInt(laenge*laenge);

}



zerlege(liste, 0, laenge-1);


for (int i=0; i<liste.length; i++)
{
System.out.print(liste[i]+" ");
}
System.out.println(" ");

}

}

Meine Fehler sind:
java.lang.ArrayIndexOutOfBoundsException: 1
at MergeSort.sortiere(MergeSort.java:25)
at MergeSort.zerlege(MergeSort.java:12)
at MergeSort.zerlege(MergeSort.java:10)
at MergeSort.zerlege(MergeSort.java:10)
at MergeSort.zerlege(MergeSort.java:10)
at MergeSort.main(MergeSort.java:66)
 
Hallo HansSchmitz91

Java:
int[] dummy = new int[r];

Gültige Indices in dem Array:
0, 1, 2, ..., r - 1

Du machst dann:
Java:
for(int z = i ; z <= r ; z++)

Das produziert folgende Werte:
0, 1, 2, ..., r

Viele Grüsse
Cromon
 
Habe immernoch hier einen Fehler :
Java:
dummy[z] = liste[z];

java.lang.ArrayIndexOutOfBoundsException: 0
at MergeSort.sortiere(MergeSort.java:25)
at MergeSort.zerlege(MergeSort.java:12)
at MergeSort.zerlege(MergeSort.java:10)
at MergeSort.zerlege(MergeSort.java:10)
at MergeSort.zerlege(MergeSort.java:10)
at MergeSort.main(MergeSort.java:66)

Habe zuvor das r auf r-1 geändert
Java:
int[] dummy = new int[r-1];
 
Hallo HansSchmitz91

Vorhin ging der Index in der Schleife von 0 bis r, und damit 1 über die Länge des Arrays hinaus, nun hast du das Array nochmals eins kleiner gemacht, damit ist in der Schleife nun 2 über das Array hinaus geschrieben.

Bitte nochmals Grundlagen durchgehen und überlegen wie es mit Arrayindices aussieht. Wie gesagt: Ein Array der Länge n kann nur Indices von 0 bis n - 1 verwenden.

Viele Grüsse
Cromon
 

Neue Beiträge

Zurück