Java: java.lang.ArrayIndexOutOfBoundsException

georg_willi

Cadet 4th Year
Registriert
Juli 2004
Beiträge
110
hi, ich hab ein problem mit meinem javaprogramm. es soll zahlen, die in einem array zufällig generiert werden, mit dem quicksort-algorithmus sortieren. die größe des array soll der benutzer eingeben können. hier das, was ich habe:

Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

public class quick {

	public static void quicksort(int l, int r, int  zahl[])
	{
		int i=l;
		int j=r;
		int merke=0;
		int mitte = zahl[(l+r)/2];
		
		while (zahl[i]<mitte)
		{
			i++;
		}		
		while(mitte <zahl[j])
		{
			j--;
		}		
		if(i<=j)
		{
			merke=zahl[i];
			zahl[i]=zahl[j];
			zahl[j]=merke;
			i++;
			j--;			
		}
	}
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br= new BufferedReader(new InputStreamReader(System.in));	
		System.out.println("Bitte geben Sie die Größe des Arrays an!");
		int n= Integer.parseInt(br.readLine());		
	    //int mitte;		
		//int merke;
		//int x=n;
		Random generator= new Random();
		int  zahl[]= new int[n];	
		
		int l=0;
	    int r = zahl.length-1;
	
		for (int a=0; a<n; a++)
		{
			zahl[n]= generator.nextInt(100);
			System.out.println(": "+zahl[a]+a);
		}
	}
}

wenn ich es nun ausführe, bekomme ich folgende fehlermeldung:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at quick.main(quick.java:47)
10 war die zahl, die ich eingegeben habe. zeile 47 steht mein generator.
danke für die hilfe im voraus.:)
 
Zuletzt bearbeitet von einem Moderator: (Bitte den [code]-Tag verwenden!)
Random liefert glaube ich Zahlen von [0;1[.
also musst du den mal 10 nehmen.
und ein Array fängt ja immer bei null an, da musst du auch drauf achten.
 
aber ich hab doch "zahl[n]= generator.nextInt(100);" geschrieben. er sucht also zahlen im bereich bis 100 aus. Vielleicht meinst du ja das richtige, ich habs nur nicht verstanden. erklär es mir bitte, bin noch java-neuling.:(
 
Code:
zahl[n]= generator.nextInt(100);
sollte eher
Code:
zahl[a]= generator.nextInt(100);
heissen. zahl[n] ist nicht definiert.
 
danke! das war ein guter schritt nach vorne. die zahlenreihe, die nun ausgegeben wird, ist aber noch nicht geordnet. das ist mir im unterricht auch öfters passiert und hab mir deswegen rat von meinem lehrer geholt. ich kann mich aber nicht mehr erinnern, was ergesagt hat (ich eben auch nur ein schüler). es waren damals ja auch andere sortier-algorithmen.
 
Das liegt daran, dass Quicksort ein rekursiver Algorithmus ist. Du rufst ihn nur einmal auf, dabei kann ja keine Sortierung zustande kommen. Ich hab den Code für Quicksort hier, aber ich weiss nicht, ob du nicht selbst drauf kommen willst.
 
man bin ich dumm. ich muss da noch

if (l<j ) {quicksortl(l,j)}

und
if (i<r ) {quicksortl(l,j)} reinbringen.

rekursiv...ja. es ist ja auch schon spät und gestern war samstag und davor kam freitagabend und ich bin 18:D .
 
ok ...zeig mir bitte mal deinen quelltex. ich hab jetzt versucht die folgenden zeilen einzubringen:
Code:
if (l<j ) {return quicksort(l,j);}
           if (i<r ) {return quicksort(l,j);}

aber ich weiß nicht wie ich es richtig in quicksort reinbringe. quicksort wird immer rot unterstrichen, es wird glaube eine array variable in der klammer verlangt.
 
Du musst natürlich deine Methode quicksort wieder mit den richtigen Parametern versorgen,
also zahl muss auch mit rein.
Code:
if (l<j ) {quicksort(l,j, zahl);}
if (i<r ) {quicksort(i,r, zahl);}
 
DANKE nochmal. du hast mir sehr geholfen:).
 
da es doch ein recht großes interesse gab, habe ich das kleine programm noch etwas ausgeschmückt und eine zeit messung implementiert.
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

public class quick {	
	public static void quicksort(int zahl[], int l, int r)
	{	
		int i=l;
		int j=r;
		int merke=0;
		int mitte = zahl[(l+r)/2];
				
		do{
			 
			 while (zahl[i] < mitte){ i++;}
			 while (mitte < zahl[j]){j--;}
			 
			 if(i<=j){			 
			 merke = zahl[i];
			 zahl[i] = zahl[j];
			 zahl[j] = merke;
			 i++;
			 j--;
			 }
		}
			 while (!(i> j));
			if (l<j ) { quicksort(zahl,l, j);}
			if (i<r ) { quicksort(zahl,i, r);}
		}			
	public static void printArray(int zahl[]){
		 
		 for(int a = 0; a<zahl.length; a++){
		 System.out.println("array["+a+"]: "+zahl[a]);
		 }
		 }	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br= new BufferedReader(new InputStreamReader(System.in));	
		System.out.println("Bitte geben Sie die Größe des Arrays an!");
		int n= Integer.parseInt(br.readLine());		
	 
		Random generator= new Random();
		int  zahl[]= new int[n];	
	      
      
       int r = zahl.length-1; 	
		for (int a=0; a<n; a++)
		{
			zahl[a]= generator.nextInt(10000);
			System.out.println("array["+a+"]: "+zahl[a]);
		}
		 long start = System.currentTimeMillis();
		quicksort(zahl,0,r);
		System.out.println("Und nun sortiert:");
		 long ende = System.currentTimeMillis();
		printArray(zahl);
		
		System.out.println("Sortierzeit : "+(ende-start)+"Millisekunden ");
	}
}

aber nicht wundern, wenn nur kleine zeitwerte gemessen werden bei relativ langer dauer. es braucht wesentlich mehr zeit alles auszugeben als zu berechnen. in der zeile
Code:
zahl[a]= generator.nextInt(100);
kann man den wertebereich des arrays festlegen
viel spaß und einen großen dank an WingX.:cool_alt:
 
Zuletzt bearbeitet:
Zurück
Oben