Gamestudio Links
Zorro Links
Newest Posts
Change chart colours
by 7th_zorro. 05/11/24 09:25
Data from CSV not parsed correctly
by dr_panther. 05/06/24 18:50
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
5 registered members (AndrewAMD, alibaba, Konsti, 2 invisible), 1,418 guests, and 2 spiders.
Key: Admin, Global Mod, Mod
Newest Members
Hanky27, firatv, wandaluciaia, Mega_Rod, EternallyCurious
19051 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Prob in Java mit Rekursion [gelöst] #168220
11/19/07 15:39
11/19/07 15:39
Joined: Feb 2004
Posts: 334
metal Offline OP
Senior Member
metal  Offline OP
Senior Member

Joined: Feb 2004
Posts: 334
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^^

Re: Prob in Java mit Rekursion [Re: metal] #168221
11/19/07 16:16
11/19/07 16:16
Joined: Feb 2003
Posts: 817
Dortmund, Germany
P
phil3d Offline
Developer
phil3d  Offline
Developer
P

Joined: Feb 2003
Posts: 817
Dortmund, Germany
quicksort rekursiv musst ich auch im ersten semester machen


Re: Prob in Java mit Rekursion [Re: phil3d] #168222
11/19/07 17:40
11/19/07 17:40
Joined: Jul 2001
Posts: 6,904
H
HeelX Offline
Senior Expert
HeelX  Offline
Senior Expert
H

Joined: Jul 2001
Posts: 6,904
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.

Last edited by HeelX; 11/19/07 17:44.
Re: Prob in Java mit Rekursion [Re: HeelX] #168223
11/19/07 17:46
11/19/07 17:46
Joined: Feb 2004
Posts: 334
metal Offline OP
Senior Member
metal  Offline OP
Senior Member

Joined: Feb 2004
Posts: 334
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^^


Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1