Prob in Java mit Rekursion [gelöst]

Posted By: metal

Prob in Java mit Rekursion [gelöst] - 11/19/07 15:39

tag zusammen,
ich missbrauch ja nicht gern solche foren, aber ich bin sicher, dass sich hier viele leute tummeln die mir bei diesen problem helfen können *g*
folgende aufgabe hab ich: ich soll ein rekursives programm schreiben, das wie quicksort ein feld von zahlen sortiert. dazu soll man 3 methoden schreiben die ein feld übergeben bekommen und eines zurückgeben, das alle elemente enthält die kleiner, gleich oder größer einem bestimmten element k sind (k=f[f.length/2] war so vorgegeben). das programm steht jetzt soweit, nur hab ich anscheinend ein kleines problem beim zusammensetzen des ergebnisfeldes. da bekomme ich ein ArrayindeyOutOfBound-Fehler...also stimmt was mit den arraygrenzen nicht so ganz.
nach langem rumsuchen bin ich anscheinend so blind geworden, dass ich den fehler nicht erkenn...kann mir da einer von euch helfen?
der code(java):

Code:
 


public class AufgabeZwei{
//public int[] f = {4,3,5,9,1,5,6,3,0,8};
public int[] f = {4,3,1};
public int[] kleiner(int[] f){

if(f.length<=1) return f;
int k = f[f.length/2];
int count=0;
for(int i=0; i<f.length; i++) {if (f[i]<k) count++; }
int[] fneu = new int[count];
for(int i=0,j =0; i <f.length;i++){if(f[i]<k){fneu[j]=f[i];j++;}}
return fneu;
}

public int[] gleich(int[] f){

if(f.length<=1) return f;
int k = f[f.length/2];
int count=0;
for(int i=0; i<f.length; i++) {if (f[i]==k) count++; }
int[] fneu = new int[count];
for(int i=0,j =0; i <f.length;i++){if(f[i]==k){fneu[j]=f[i];j++;}}
return fneu;
}

public int[] groesser(int[] f){

if(f.length<=1) return f;
int k = f[f.length/2];
int count=0;
for(int i=0; i<f.length; i++) {if (f[i]>k) count++; }
int[] fneu = new int[count];
for(int i=0,j =0; i <f.length;i++){if(f[i]>k){fneu[j]=f[i];j++;}}
return fneu;
}

public int[] Quicksort(int[] f){
if(f.length<=1) return f;
int[] rueckgabe=Quicksort(kleiner(f));
int[] rueckgabe2=gleich(f);
int[] rueckgabe3=Quicksort(groesser(f));
int [] fneu = new int[rueckgabe.length+rueckgabe2.length+rueckgabe3.length];
if(rueckgabe.length!=0){for(int i=0; i <=rueckgabe.length-1;i++){fneu[i]=rueckgabe[i];}}
if(rueckgabe2.length!=0){for(int i =rueckgabe.length; i <=rueckgabe.length+rueckgabe2.length-1;i++){fneu[i]=rueckgabe2[i];}}
if(rueckgabe3.length!=0){for(int i =rueckgabe.length+rueckgabe2.length; i <=fneu.length-1;i++){fneu[i]=rueckgabe3[i];}}
return fneu;
}

public void test(){
int ausgabe[]=Quicksort(f);
System.out.println("Ausgabe:");
for(int i=0;i<ausgabe.length;i++){System.out.println(ausgabe[i]);}
}
}



ich hoffe mal die formatierung geht nicht ganz flöten^^
Posted By: phil3d

Re: Prob in Java mit Rekursion - 11/19/07 16:16

quicksort rekursiv musst ich auch im ersten semester machen
Posted By: HeelX

Re: Prob in Java mit Rekursion - 11/19/07 17:40

Das Problem sind IMHO diese beiden Zeilen:

Code:
if(rueckgabe2.length!=0){for(int i =rueckgabe.length; i <=rueckgabe.length+rueckgabe2.length-1;i++){fneu[i]=rueckgabe2[i];}}
if(rueckgabe3.length!=0){for(int i =rueckgabe.length+rueckgabe2.length; i <=fneu.length-1;i++){fneu[i]=rueckgabe3[i];}}



Du mergest die 3 Felder indem du in den Schleifen mit dem Zähler an den absoluten Grenzen entlanggehst, die du dir aus den Längen der Teil-Felder berechnest. Das ist ja auch soweit ok. i enthält also immer die aktuelle Position des Feldelements des _Zielarrays_, in das du schreiben willst. Nur machst du den Fehler, dass du mit i auf den Inhalt der Ursprungsfelder zugreifst. Hat also das Zielarray die Größe 100 und du beschreibst das Element 91 und bist gerade dabei das "Größer"-Array einzufügen - dass jedoch nur die Länge 10 hat - versuchst du _dort_ auf den 91. Eintrag zuzugreifen und du hast deinen schönen Out-Of-Bounds Fehler.

Lösung: entweder du brichst beim Zugriff auf die Ursprungsfelder das i runter sodass der Zugriff richtig ist oder du schreibst dass so um, dass du mit i immer relativ arbeitest und der Zugriff auf das Urpsprungsarray richtig ist und du nur umrechnen musst, wo du dich im Zielarray befindest.

Eleganter wäre folgendes: du könntest dir ne Methode schreiben, die eine generische variable Liste von Arrays gleichen Typs merged und zurückgibst - und dabei typsicher bleibst! Aber ich glaube das macht ihr erst später.

Ciao, Christian

BTW: die drei Methoden da sind ja alle im Prinzip gleich bis auf den Vergleichstyp. Versuche mal das auf eine runterzubrechen.
Posted By: metal

Re: Prob in Java mit Rekursion - 11/19/07 17:46

danke für die antwort, werd gleich mal schaun ob ichs hinbekomm:)
das problem bei der aufgabe ist, dass z.b. die 3 methoden vorgegeben sind..die aufgabenstellung ist so in etwa: a) baue diese 3 methoden b)benutze diese um ein rekursives prog zu basteln dass soundso funktioniert .."schreiben sie einen rekursiven quicksortalgo" wär um einiges einfacher*g*

EDIT: hab in der for-schleife ne 2te variable für das rückgabefeld eingeführt, so klappts! ...kleiner fehler, große wirkung^^
© 2024 lite-C Forums