SlowSort?
Hallo,
In einer SlowSort teilt man das Array in 2 Teile. Aber ich muss ein java Programm schreiben EvenSlowSort:
1. Sortiere den ersten Teil des Arrays rekursiv mittels EvenSlowerSort.
2. Sortiere den zweite Teil des Arrays rekursiv mittels EvenSlowerSort.
3. Sortiere den dritten Teil des Arrays rekursiv mittels EvenSlowerSort.
4. Finde das Maximum des gesamten Arrays, indem man die jeweils letzten Elemente
der Teile vergleicht, und platziere es an das Ende des gesamten Arrays.
5. Sortiere das Array ohne das letzte Element (dem Maximum aus 4)
meine Code schaut so aus:
int m = Math.floorDiv(i+j,3);
evenSlowerSortExtra(array,i,m); //StackOverflowError
evenSlowerSortExtra(array,m+1,j-m);
evenSlowerSortExtra(array,j-m+1,j);
Dann findet er das Maximum und so weiter aber ich bekomme ein StackOverflowError.
habt ihr vllt Vorschläge ich hänge schon seit 2 Tagen in dieser aufgabe -.-
Danke im Voraus.
Grüße.
3 Antworten
Stack Overflow deutet darauf hin, dass Du die Rekursion nicht abbrichst.
Das Ergebnis der Division wird irgendwann 0, vermutlich wird die Rekursion dann aber nicht abgebrochen. (dein Code ist ja vermutlich nicht vollständig - zumindest der Prozedurkopf fehlt oder/und i und j kommen "aus dem Nichts")
(Ich gehe mal davon aus, dass ihr davon ausgehen dürft, dass ein leeres Array sortiert ist)
-----
Bei einer nicht abbrechenden Rekursion logge ich gerne die Argumente, die von Rekursionsschritt zu Rekursionsschritt geändert werden. Da sieht man so was sofort.
(Irgendwie muss ich jetzt an ForumSort denken - es werden ein paar Foren für Programmierer nach Sortieralgorithmen durchsucht und zufällig einer hiervon ausgewählt. Das Fundstück wird kompiliert und auf das Original-Array angewandt. Wenn das zurückgegebene Array sortiert ist, ist man fertig. Wenn nicht, wird ab Schritt 1 wiederholt. Bei einer unbehandelten Ausnahme wird ab Schritt 1 wiederholt. Falls das Verfahren länger als 2^(2^array.length) Sekunden dauert, wird es abgebrochen und ab Schritt 1 wiederholt.
Ich vermute, dass i eine untere Grenze, j eine obere Grenze in Deinem Array sein soll. m soll wohl das Intervall [i:j] in Drittel unterteilen. Wenn das so stimmt, dann definierst Du m falsch:
m = (j-i)/3
Und Du musst die Grenzen Deiner SlowSort korrigieren, die passen beim ersten und beim zweiten Aufruf nicht:
evenSlowerSort Extra(array,i,i+m), evenSlowerSortExtra(array,i+m+1, j-m)
Die Intervalle gehen [i:i+m], [i+m+1:j-m] und [j-m+1:j]!
Der Stackoverflow passiert IMHO, weil in Deinem ersten Aufruf "irgendwann" m<i werden kann (z.B. i=100, j=140, m = 80 (mit Deiner Definition) -> Aufruf evenSlowerSortExtra(array,100,80) ... was nicht wirklich sinnig ist)
Meine zwei Cent.