Insertion Sort Algorithmus problem

Status
Nicht offen für weitere Antworten.

hedges

Mitglied
ich bekomme in zeile 22 ein ArrayIndexOutOfBoundsException: 4

versteh aber nicht warum.
kann mir das einer erklären?


Code:
public class prog1uebung41 {

	public static void main(String[] args) 
	{
		prog1uebung41.aufgabe2();
	}
	
	public static void aufgabe2()
	{
		int[] raniarray = {5,1,2,4};
		int puffer;
		
		for (int o = 0; o < raniarray.length; o++)
		{
			System.out.println(o+". Element "+raniarray[o]);
		}
		
		for (int i = 1; i < raniarray.length; i++)
		{
			for ( int z = 0; z < i ; z++ )
			{
				if ( raniarray[i] <= raniarray[z] )			
				{
					puffer = raniarray[i];
					int j=i;
					do 
					{
						if ( j == 0 ){break;}
						raniarray[j] = raniarray[j-1];	
						j--;
						
					}while(raniarray[z]==raniarray[j+1]);
					
				raniarray[z] = puffer;
				z=i;
				}
			}
		}
		System.out.println("Das neu sortierte Array");
		for (int o = 0; o < raniarray.length; o++)
		{
			System.out.println(o+". Element "+raniarray[o]);
		}
	}
}
 
S

SlaterB

Gast
> for (int i = 1; i <= raniarray.length; i++)
> {

i kann 4 sein, das Array ist aber nur 4 lang, damit sind nur Indexe 0, 1, 2 und 3 erlaubt

vergleiche das mit der vorherigen Schleife:
> for (int o = 0; o < raniarray.length; o++)
> {

o wird nicht 4
 

hedges

Mitglied
ein problem hab ich noch, er sortiert das array richtig bis 1 2 5 4 dann tauscht er die 4 mit der 5, allerdings überschreibt er das zweite array element mit dem inhalt des ersten elements.
ich kapier aber nicht warum, da ja z = 2 sein muss ( für die 5) und fertig. warum wechselt er nochmal array[0] auf array[1]?
 
S

SlaterB

Gast
ich sehe, warum das Programm das macht auf Code-Ebene,
verstehe aber absolut nicht, was die while-j-Schleife da machen soll,
und kann daher nicht sagen, was daran richtig oder falsch ist,

ich finde, dass diese Schleife nur zwischen z und i laufen sollte,
durch das j bzw. durch das while(raniarray[z]==raniarray[j+1]); gehts aber viel weiter nach links

da muss eine Bedingung wie
while (j > z)
rein oder ähnliches, wieso ein Vergleich der Array-Elemente?
 

hedges

Mitglied
vergleich der array elemente muss ja sein um rauszufinden ob array kleiner array[z] ist, und wenn ja sollen ja alle elemente eins nach rechts gerückt werden, und array an der stelle array[z] eingefügt werden.
 
S

SlaterB

Gast
alles klar, mit einer Antwort 'ist doch richtig so' sind meine Zweifel ausgeräumt
:bahnhof:


du musst schon Schritt für Schritt erklären was da passiert

-------

> vergleich der array elemente muss ja sein um rauszufinden ob array kleiner array[z] ist

das ist sowieso der Fall, bis
> if ( raniarray <= raniarray[z] )
ist alles korrekt,
was die do-while-Schleife darin dann macht ist aber fraglich

> und wenn ja sollen ja alle elemente eins nach rechts gerückt werden, und array an der stelle array[z] eingefügt werden.

dass das nicht passiert sagt dir ja das Programm selber, in meiner Anwort stehts auch,
was bringt es, diese Aussage zu wiederholen?

es ist immer noch fraglich, was dein Programm an dieser Stelle tut,
ich glaube ja gerne, dass du das richtige vorhast,
interessant sind nun aber die einzelnen Schritte, die du dafür einsetzt
 

xysawq

Bekanntes Mitglied
Ich glaube mit der while-Schleife versucht er solange zu schieben, bis das Ende erreicht ist, auch wenn es mehr als sinnlos ist.

Eine einfache for-Schleife hätte gereicht, da man ja die Position und die Länge kennt.

Aber diese Aufgabe ist so einfach, da bringt es mehr den Herren nach diesem Tipp selber auf den Code kommen zu lassen (der nun wirklich nicht schwer ist).

Bubble-Sort war das doch im Übrigen, oder?
 

hedges

Mitglied
Beispiel array = {5,1,2,4}

die while schleife verschiebt array[0] ( 5 ) ein feld nach rechts.
Code:
raniarray[j] = raniarray[j-1];

ergo is das neue array = {5,5,2,4}
da ich aber vorher das grad überschriebene element gespeichert hab:
Code:
puffer = raniarray[i];

füg ich dieses wieder ein mit
Code:
raniarray[z] = puffer;
und das array ist nun: array = {1,5,2,4}

das ist genau das was auch passieren soll, allerdings wird beim letzen durchlauf array[1] mit array[0] überschrieben und ich weiß nicht warum.

array vorletzter durchlauf : array = {1,2,5,4}
array nach dem letzten durchlauf : array = {1,1,4,5}

also hat er erkannt das 4 kleiner 5 ist, hat die 5 auf die position von der 4 verschoben, die 5 auf die position der 4 gespeichert, ABER leider auch element [1] mit inhalt vom element [0] überschrieben, und da weiß ich nich weiter warum dsa passiert.

hoffe das mein problem jetzt klarer geworden ist ;)
 

hedges

Mitglied
@ xysawq

es soll später mit einem zufällig generierten array sortiert werden, ergo ist die anzahl nicht klar.

es ist der insertion sort algorithmus...
 

xysawq

Bekanntes Mitglied
...ähm... array.length ist doch eine bekannte länge oder?

und ja, es ist insertion... bubble war ja das tauschen mit dem nachbarn...

dann hast du z und i als position, was will man mehr?
 
S

SlaterB

Gast
das Problem ist von Anfang an völlig klar, ich verstehe vollkommen, wie so ein Programm arbeiten sollte und verstehe vollkommen, dass da was falsch passiert und auch wo,

ich könnte nun ein korrektes Programm posten, aber das ist nicht in meinem Sinne,
ich versuche daher seit mehreren Post dich zu fragen, was du da programmiert hast,

eine Antwort 'ein korrektes Programm' hilft da nicht weiter,
sondern etwas in Art von
'die Schleife j fängt bei i an und geht dann immer weiter nach links und schreibt jedes Element ein Feld weiter rechts,
die Schleife geht immer weiter nach links bis ... [hier verstehe ich nämlich deinen Code absolut nicht]'

damit will ich erreichen, dass du über deinen Code nachdenkst, ihn mal in Worten beschreibst und wir die Denkfelher aufdecken können, die zu diesem falschen Code führen,

also: was passiert dort in Zeile 26 bis 32, insbesondere was soll die Bedingung 32?
du musst dir doch irgendwas dabei gedacht haben,
und antworte bitte nicht nochmal 'das ist Code der zur korrekten Sortierung führt', sondern WAS GENAU DIESER CODE MACHT?! ;)
 

xysawq

Bekanntes Mitglied
jetzt bin ich mal gespannt, das hat der schlaue SlaterB wieder mal klar und deutlich augedrückt, so wie es sein soll :p
 

hedges

Mitglied
Code:
   do{
anfang do schleife

Code:
 if ( j == 0 ){break;}
wenn j null sein sollte muss die while schleife unterbrochen werden da in der nächsten zeile j-- dann ein array[-1] geben würde, und das nich geht, daher diese zeile

Code:
raniarray[j] = raniarray[j-1];
hier wird dem element welches einsortiert werden soll ein neues wert zugewiesen, und zwar der wert des elements links danaben

Code:
j--;
hier wird j dekrementiert, damit alle elemente links von dem neu einzuordnenden element jeweils um eins nach rechts verschoben wird.

Code:
}while(raniarray[z]==raniarray[j+1]);
abbruch der while schleife wenn
z ( die position wohin das neu einzuordnende element hin soll )
gleich ist wie das einzuordnende element.
 
S

SlaterB

Gast
nun gut, da kommen wir wohl nicht weiter, ich verstehe es jedenfalls immer noch nicht

du hast
1, 2, 5, 4

als erstes wird daraus
1, 2, 5, 5
j ist dann 2, array[z=2] == 5 == 5 == array[j+1=3], ok

ich meine, dass an dieser Stelle abgebrochen werden müsste (*),
du schreibst aber, dass es an dieser Stelle weiter geht,
warum willst du nicht näher erläutern, ich kann es nicht hellsehen,

das Unglück nimmt seinen Lauf, nächster Durchgang:
1, 2, 2, 5
j=1
die while-Bedingung ist immer noch erfüllt,
array[z=2] == 2 == 2 == array[j+1=2],
j+1 ist gar direkt z,
while sagt ok, warum verstehe ich nicht, kann dir dabei nicht helfen

als nächstes
1, 1, 2, 5
j=0
hier nun endlich Abbruch der Schleife
array[z=2] == 2 != 1 == array[j+1=1],



danach wird dann Array[z] auf 4 gesetzt

-----------

als Lösungshinweis noch: ich würde die Schleife an Punkt (*) weiter oben abbrechen, wie schon gesagt,
am besten mit einer ganz einfachen Bedingung wie while(j>z) oder so, evtl +-1,

die Bedingung
if ( j == 0 ){break;}
könnte dann übrigens wegfallen, j muss nicht kleiner als z werden
 

xysawq

Bekanntes Mitglied
Code:
	int kleinsteZahl;
	int position;
	
	for(int i=0; i<(array.length-1); i++)
	{
		kleinsteZahl = array[i];
		position = i;
		for(int j=1; j<array.length; j++)
		{
			if(array[j] < kleinsteZahl)
			{
				kleinsteZahl = array[j];
				position = j;
			}
		}
		
		if(i != position)
		{
			for(int k=position; k>i; k--)
			{
				array[k] = array[k-1];
			}
			array[i] = kleinsteZahl;
		}
	}

mir reichts, nimm jetzt endlich FOR-Schleifen, das ist doch alles sinnlos da oben...
 

hedges

Mitglied
hab das mal getestet mit deinem code, leider wird das array nich richtig sortiert.

Code:
public static void test1()
	{
		
		   int[] array = {5,1,2,4};
		   int kleinsteZahl;
		   int position;
		   
		   for(int i=0; i<(array.length-1); i++)
		   {
		      kleinsteZahl = array[i];
		      position = i;
		      for(int j=1; j<array.length; j++)
		      {
		         if(array[j] < kleinsteZahl)
		         {
		            kleinsteZahl = array[j];
		            position = j;
		         }
		      }
		      
		      if(i != position)
		      {
		         for(int k=position; k>i; k--)
		         {
		            array[k] = array[k-1];
		         }
		         array[i] = kleinsteZahl;
		      }
		   }
			for (int o = 0; o < array.length; o++)
			{
				System.out.println(o+". Element "+array[o]);
			}
	}

bekomm ich folgende ausgabe:

Code:
0. Element 1
1. Element 2
2. Element 2
3. Element 4

es sollte aber eigentlich

Code:
0. Element 1
1. Element 2
2. Element 4
3. Element 5

sein.
 

hedges

Mitglied
so hab jetzt meine version doch noch fertigstellen können.
ich wollte lieber eine eigene version schreiben, da ick sonst ja nix dabei lerne. auch wenn mich das jetzt insgesamt 6 stunden gekostet hat....naja aus fehlern lernt man.

ich habe einfach etliche ausgaben machen lassen und bin bei einem beispiel array alles komplett durchgegangen.
hier die lösung, es lag an einem falschen abbruch der while schleife.



Code:
	public static void aufgabe2()
	{
		int[] raniarray;
		raniarray = new int[99];
		int puffer;

		System.out.println("Zufalls - Array generieren:");
		
		for (int i = 0; i < raniarray.length; i++)
			{
				int zufallszahl = new Random().nextInt( 1000 );
				raniarray[i] = zufallszahl;

				if (i%10 == 0)
				{
					System.out.println("\n");
				}
				System.out.print(raniarray[i]+" ");
			}

		for (int i = 1; i < raniarray.length; i++)
		{
			for ( int z = 0; z < i ; z++ )
			{
				if ( raniarray[i] <= raniarray[z] )			
				{
					puffer = raniarray[i];
					int j=i;
					do 
					{
						if ( j == z ){;break;}
						raniarray[j] = raniarray[j-1];	
						j--;
					}while(z<j);
					
				raniarray[z] = puffer;
				z=i;
				}
			}
		}
		System.out.println("\n\nDas neu sortierte Array:");
		for (int o = 0; o < raniarray.length; o++)
		{
			if (o%10 == 0)
			{
				System.out.println("\n");
			}
			System.out.print(raniarray[o]+" ");
		}
	}
}

ich danke euch für die hilfe. und sry das ick vielleich bissl gestresst hab...cya danny
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
emreiu Formatiertes Output bei Insertion Sort Java Basics - Anfänger-Themen 6
O Sortieren mit Insertion Sort Java Basics - Anfänger-Themen 3
L Insertion Sort bei zweidimensionalem Array Java Basics - Anfänger-Themen 7
G Insertion Sort mit Aray Java Basics - Anfänger-Themen 5
O Insertion Sort Java Basics - Anfänger-Themen 4
B Strings alphabentisch sortieren mit Hilfe von insertion sort Java Basics - Anfänger-Themen 6
D Insertion sort auf eine liste Java Basics - Anfänger-Themen 4
P Problem mit Insertion Sort Java Basics - Anfänger-Themen 4
C InSertion Problem! Java Basics - Anfänger-Themen 2
Tw1Z Erste Schritte Sort in java Java Basics - Anfänger-Themen 2
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
X Collections.sort als Lambda Java Basics - Anfänger-Themen 14
berserkerdq2 Geht collections.sort bei allen? Linkedhashset, ArrayList, HashSet etc. Java Basics - Anfänger-Themen 4
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
Marc111111111 Selection Sort in Java?? Java Basics - Anfänger-Themen 6
O Collections.sort und List.sort mit Lambda Verwirrung Java Basics - Anfänger-Themen 5
B Collections.sort mit zwei Bedingungen? Java Basics - Anfänger-Themen 4
M Collection.sort sortiert nicht Java Basics - Anfänger-Themen 7
CptK Best Practice Merge-Sort als Baum darstellen Java Basics - Anfänger-Themen 3
P Java Bubble Sort,Anfängerfehler Java Basics - Anfänger-Themen 4
S Methoden Sort Array Java Basics - Anfänger-Themen 9
I Erste Schritte sort() vs. sort() Java Basics - Anfänger-Themen 9
BadBat ArrayList<String> sort by last word Java Basics - Anfänger-Themen 8
U Methoden Zweidimensionales Array mit Arrays.sort sortieren? Java Basics - Anfänger-Themen 22
X Quick Sort - Vergleichsoperationen zählen Java Basics - Anfänger-Themen 0
N Bubble Sort sortieren mit Int Werte Java Basics - Anfänger-Themen 8
C OOP array Sortieren ohne den sort Befehl Java Basics - Anfänger-Themen 10
S int-Array mittels Arrays.sort() in einer Schleife sortieren. Java Basics - Anfänger-Themen 2
N Schlüsselworte Bubble Sort nach eigener Ordnung Java Basics - Anfänger-Themen 8
J Fehler im Selection Sort Java Basics - Anfänger-Themen 5
O Listen sort-Methode Java Basics - Anfänger-Themen 1
M Quick Sort Java Basics - Anfänger-Themen 4
V Heap-Sort Java Basics - Anfänger-Themen 0
M Methoden Quick Sort Java Basics - Anfänger-Themen 5
T array.sort mit zwei Kriterien Java Basics - Anfänger-Themen 8
S Liste und Bubble Sort Java Basics - Anfänger-Themen 4
H Collections Was ist schneller - HashMap + Sort v TreeMap? Java Basics - Anfänger-Themen 75
S Fehler bei Arrays.sort(array) - Methode!? Java Basics - Anfänger-Themen 3
P collections.sort Java Basics - Anfänger-Themen 2
B Arrays.sort Java Basics - Anfänger-Themen 4
P schneller Sort ? Java Basics - Anfänger-Themen 2
S Bubble Sort Java Basics - Anfänger-Themen 5
B Merge-Sort Analyse Java Basics - Anfänger-Themen 27
K Array.sort() Java Basics - Anfänger-Themen 12
H Etwas wie sort() / sorted() in JAVA-Collections? Java Basics - Anfänger-Themen 5
B 2 dimensionales Array: Selection Sort Java Basics - Anfänger-Themen 4
F Methoden Insert Sort Fehler Java Basics - Anfänger-Themen 10
P Ein sort problem Java Basics - Anfänger-Themen 6
S Bubble Sort Algorithmus Java Basics - Anfänger-Themen 3
N Selection Sort Problem Java Basics - Anfänger-Themen 19
Spin sort tokens - somebody knows a better solution? Java Basics - Anfänger-Themen 13
P Array.sort // Arrays ausgeben Java Basics - Anfänger-Themen 21
S String sortieren mit Interface und sort() Java Basics - Anfänger-Themen 6
F Arrays.sort( ) Problem Java Basics - Anfänger-Themen 14
J Liste von Integers mit Selection Sort sortieren Java Basics - Anfänger-Themen 3
B Selection sort Java Basics - Anfänger-Themen 33
E Selection Sort für beliebige Objekte Java Basics - Anfänger-Themen 24
U Selection Sort schnellere Variante Java Basics - Anfänger-Themen 17
T Selection-Sort-Algorithmus Java Basics - Anfänger-Themen 9
Dit_ Collections.sort(..); | Anwendung Java Basics - Anfänger-Themen 4
N java.util.Arrays.sort Warum sind Leerzeichen vor alphabetischen Zeichen sortiert? Java Basics - Anfänger-Themen 12
X Counting Sort Java Basics - Anfänger-Themen 5
G Quick Sort - bin ich zu blöd? Java Basics - Anfänger-Themen 7
D sort.exe über java aufrufen Java Basics - Anfänger-Themen 2
V Bubble Sort endet in Endlosschleife Java Basics - Anfänger-Themen 4
S Collection<Typ> sort Java Basics - Anfänger-Themen 4
N Collections Sort ArrayList<> Java Basics - Anfänger-Themen 7
K Arrays.sort() Java Basics - Anfänger-Themen 2
S Collection Sort Java Basics - Anfänger-Themen 15
O Arrays und sort Java Basics - Anfänger-Themen 4
I Selection-Sort // Array *help* Java Basics - Anfänger-Themen 2
G sort(int[] a, int fromIndex, int toIndex) Java Basics - Anfänger-Themen 5
J Selection Sort in Liste implementieren Java Basics - Anfänger-Themen 3
F Klassenmethode Arrays.sort(Object[]a) Java Basics - Anfänger-Themen 2
H Bubble sort array Java Basics - Anfänger-Themen 12
M Bubble-Sort und null Werte Java Basics - Anfänger-Themen 4
G Zählen von Zuweisungen bei Bubble Sort Java Basics - Anfänger-Themen 3
I Methode Arrays.sort(Object[] arr) Java Basics - Anfänger-Themen 19
K compareTo in Verbinug mit Arrays.sort() Java Basics - Anfänger-Themen 4
0 Selection Sort funktioniert nicht. Java Basics - Anfänger-Themen 3
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
U Array.sort auf variable Array-Größe anwenden Java Basics - Anfänger-Themen 3
D Mit java.util.Arrays.sort die negativen Zahlen hinten Java Basics - Anfänger-Themen 4
D Collections.sort() frage Java Basics - Anfänger-Themen 6
V Sortieren mit Bubble-Sort Java Basics - Anfänger-Themen 5
G Arrays.sort() will nicht sortieren Java Basics - Anfänger-Themen 8
G float-Array _ohne_ Arrays.sort sortieren Java Basics - Anfänger-Themen 5
A Bubble-Sort Java Basics - Anfänger-Themen 3
R Frage zu Bubble-Sort Java Basics - Anfänger-Themen 10
K Algorithmus entwickeln Java Basics - Anfänger-Themen 1
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
C Gewinnspiel erstellen mit Algorithmus Java Basics - Anfänger-Themen 3
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
H Minimax Algorithmus in Tic Tac Toe Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
ohneInformatik; Trockentest Algorithmus, mathematischen Zusammenhang angeben Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus Java Basics - Anfänger-Themen 17
mervanpolat Binary Search Algorithmus ausführen Java Basics - Anfänger-Themen 1
J Rekursiver Algorithmus Java Basics - Anfänger-Themen 9
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben