MergeSort iterativ mit Stacks

info123

Mitglied
Hallo an alle!

Ich soll eine iterative Variante von MergeSort mithilfe von Stacks in Pseudocode angeben.
Ich kenne MergeSort nur rekursiv und "verstehe" dementsprechend nur diese Variante.
Mein Problem fängt schon damit an, dass ich mir die iterative Variante nicht richtig vorstellen kann. Wie wird der Array geteilt, wenn der Algorithmus denn noch überhaupt so funktioniert ?

Ich bin anfangs wohl etwas naiv vorgegangen und dachte mir, dass ich mein Array teile und die rechte Hälfte im Stack ablege, dann teile ich mein linkes Teilarray und lege dessen rechte Hälfte wieder im Stack ab, usw bis nur noch ein Element im Array ist.
Dabei hat sich mir allerdings die Frage gestellt, ob meine rechten Hälften auch als Hälften im Stack abgelegt werden oder wie ein einem Array die einzelnen Arrayelemente pro Stackstelle abgelegt werden.
Jetzt gibt es zwei weitere Probleme: wie bearbeite ich die Hälften in meinem Stack und wie wende ich "merge" an, um meine Elemente am Ende wieder sortiert ausgeben zu können.

Das war so mein erster Gedanke, aber wie gesagt, ich kann nicht ganz nachvollziehen wie der Algorithmus iterativ und erst recht nicht, wie er mit Stacks funktionieren soll.

Ich hoffe mir kann das jemand erklären bzw helfen.
 

info123

Mitglied
Das habe ich gefunden, aber nicht ganz verstanden.

Der Inhalt meines Array wird auf Stack1 verschoben.
Dann durchlaufe ich Stack1 und schiebe die Elemente auf die Arrays l und r. Frage: wird immer jeweils ein Element in r und l gespeichert ? In meinem weiteren Verständnis gehe jetzt davon aus:
Ich merge meine Elemente aus l und r in einen neuen Array merged und schiebe den Inhalt auf Stack2, so dass in Stack2 "Pärchen" von Zahlen sind. Nach diesem Prinzip durchlaufe ich Stack1 solange, bis ich nur noch ein Element in Stack1 habe (erste innere while-Schleife)
Jetzt durchlaufe ich mein Stack2 nach dem selben Prinzip, bis ich nur noch noch 1 Element/Paar in Stack2 habe. Das heißt ich speichere die sortierten Zahlenpaare aus Stack2 in den Arrays l und r und merge wieder alles zusammen und speichere es in Stack1 (zweite innere while schleife).

1) Warum wird abgefragt, dass Stack1 bzw Stack2 >1 Elemente im Stack haben und nicht stack.size()>0 ?
Wenn ich mir jetzt die äußere while-Schleife angucke, habe ich am Ende noch ein Element in Stack1, das wird aber in der zweiten inneren while-Schleife mit der sortieren Folge aus Stack2 gemerged, aber was ist mit dem letzten Paar in Stack2?
2) Ich verstehe den return-Befehl nicht ganz "return stack.isEmpty() ? stack2.pop() : stack.pop()"
Wird hier nacheinander zuerst aus Stack2 und dann aus Stack2 ausgeben ? Falls ja, was ist denn mit dem letzen Element aus stack2, dass nicht gemerged wurde mit dem Rest ?

Ich hoffe das ist verständlich was ich meine. Oder ich hab den Code komplett falsch verstanden. Falls dies der Fall ist, wäre es nett wenn mir das nochmal jemand erklären könnte!
 
X

Xyz1

Gast
Ich kenne MergeSort nur rekursiv und "verstehe" dementsprechend nur diese Variante.
Na statt des rekursiven Aufrufs nimmst du dann einen Stack her. Zweites Semester.

Du musst dir nur verdeutlichen was bei einem Methodenaufruf und Ende geschieht.

Ich habe eigentlich keine groß Lust das zu implementieren. Du kannst das machen.

In meinem weiteren Verständnis gehe jetzt davon aus
Man kann eigentlich erst von Verständnis sprechen wenn man es hat.
Denn sonst ist das kein Verständnis sondern ((arg)listige) Täuschung.

Noch ne Tipp ... Nein, du musst nichts in den Stack's umordnen.
 

Meniskusschaden

Top Contributor
Eine Alternative wäre es, mit drei Stacks zu arbeiten. Zuerst kommen alle Elemente in Stack1. Dann werden sie in einer Schleife immer wieder zuerst von Stack1 nach Stack2 und Stack3 verschoben (split) und anschliessend wieder nach Stack1 zurück verschoben (merge). Nach dem ersten merge besteht Stack1 dann aus in sich sortierten 2er-Blöcken, nach dem zweiten merge aus 4er-Blöcken, etc. Die split- und merge-Läufe müssen dementsprechend immer blockweise organisiert werden.
 

info123

Mitglied
@DerWissende
Was soll mir die Semesteranzahl sagen? Wenn ich es nicht verstehe, verstehe ich es nicht. Deswegen habe ich deutlich gefragt, ob mir das jemand erklären kann. Mir mehr oder weniger zu sagen "Ja, offensichtlich verstehst du es nicht" bringt mir leider nichts. Das weiß ich selber. Deswegen wende ich mich hier ans Forum, in der Hoffnung dass es Menschen gibt, die es besser können und mir erklären können.
Hier muss auch nichts implementiert werden, da soll "nur" einen Pseudocode her. Wie soll ich den aber angeben, wenn ich nicht verstehe bzw nicht nachvollziehen kann, wie der Algorithmus arbeitet.


@Meniskusschaden
Ich glaube ich verstehe worauf du hinaus willst, aber irgendwie auch nicht. Ich habe es glaub ich oben irgendwo erwähnt, aber mein Hauptverständnisproblem ist der ganze Vorgang des Teilens.
Ich speichere mein Array in Stack1, dann speichere ich ein Zahlenpaar in Stack2, eins in Stack3, merge jeweils Stack2 und Stack3, merge dann Stack2 UND Stack3 und speichere in Stack4 ? Das passiert dann solange, bis Stack1 leer ist oder nur noch 1Element hat und dann merge ich den Stack4 und Stack1?
 

Meniskusschaden

Top Contributor
Hier ist mal ein Beispiellauf mit acht Zahlen für die Variante mit vier Stapeln. Die rechte Seite soll jeweils die zugängliche obere Seite eines Stapels sein. Wichtig ist noch, dass für Richtung von S1/S2 nach S3/S4 das jeweils kleinste Element und für die umgekehrte Richtung das jeweils größte ausgewählt wird.
Code:
S1: 1, 3, 8, 7, 4, 6, 5, 2   S3:
S2:                          S4:

abwechselnd nach S3/S4 verschieben

S1:                          S3: 2, 6, 7, 3
S2:                          S4: 5, 4, 8, 1

Richtungswechsel (grösstes zuerst)

S1: 3                        S3: 2, 6, 7
S2:                          S4: 5, 4, 8, 1

S1: 3, 1                     S3: 2, 6, 7
S2:                          S4: 5, 4, 8

Kein passendes Element => Zielstapel wechseln

S1: 3, 1                     S3: 2, 6, 7
S2: 8                        S4: 5, 4

S1: 3, 1                     S3: 2, 6
S2: 8, 7                     S4: 5, 4

S1: 3, 1                     S3: 2
S2: 8, 7, 6                  S4: 5, 4

S1: 3, 1                     S3: 2
S2: 8, 7, 6, 4               S4: 5

S1: 3, 1                     S3:
S2: 8, 7, 6, 4, 2            S4: 5

Kein passendes Element => Zielstapel wechseln

S1: 3, 1, 5                  S3:
S2: 8, 7, 6, 4, 2            S4:

Richtungswechsel (kleinstes zuerst)

S1: 3, 1, 5                  S3: 2
S2: 8, 7, 6, 4               S4:

S1: 3, 1, 5                  S3: 2, 4
S2: 8, 7, 6                  S4:

S1: 3, 1                     S3: 2, 4, 5
S2: 8, 7, 6                  S4:

S1: 3, 1                     S3: 2, 4, 5, 6
S2: 8, 7                     S4:

S1: 3, 1                     S3: 2, 4, 5, 6, 7
S2: 8                        S4:

S1: 3, 1                     S3: 2, 4, 5, 6, 7, 8
S2:                          S4:

Kein passendes Element => Zielstapel wechseln

S1: 3                        S3: 2, 4, 5, 6, 7, 8
S2:                          S4: 1

S1:                          S3: 2, 4, 5, 6, 7, 8
S2:                          S4: 1, 3

Richtungswechsel (grösstes zuerst)

S1: 8                        S3: 2, 4, 5, 6, 7
S2:                          S4: 1, 3

S1: 8, 7                     S3: 2, 4, 5, 6
S2:                          S4: 1, 3

S1: 8, 7, 6                  S3: 2, 4, 5
S2:                          S4: 1, 3

S1: 8, 7, 6, 5               S3: 2, 4
S2:                          S4: 1, 3

S1: 8, 7, 6, 5, 4            S3: 2
S2:                          S4: 1, 3

S1: 8, 7, 6, 5, 4, 3         S3: 2
S2:                          S4: 1

S1: 8, 7, 6, 5, 4, 3, 2      S3:
S2:                          S4: 1

S1: 8, 7, 6, 5, 4, 3, 2, 1   S3:
S2:                          S4:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F MergeSort iterativ mit Hilfe von Stack Java Basics - Anfänger-Themen 5
L Mergesort (aber anders) Java Basics - Anfänger-Themen 2
KogoroMori21 MergeSort Algorithmus Java Basics - Anfänger-Themen 2
O Rekursion Mergesort Java Basics - Anfänger-Themen 18
E Methoden 2 Arrays sortieren (MergeSort) Java Basics - Anfänger-Themen 3
H Mergesort aufwand berechen Java Basics - Anfänger-Themen 5
L Methoden Mergesort methode Java Basics - Anfänger-Themen 4
K MergeSort Stackoverflow Java Basics - Anfänger-Themen 5
K Mergesort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
A Rekursion (anhand von Mergesort) nachvollziehen Java Basics - Anfänger-Themen 4
M Erklärung Code Mergesort Bitte Java Basics - Anfänger-Themen 3
A Probleme mit MergeSort Generische Liste Java Basics - Anfänger-Themen 0
M Mergesort Aufgabe große Probleme Java Basics - Anfänger-Themen 9
P Mergesort Probleme Java Basics - Anfänger-Themen 4
I Mergesort mit ArrayList Java Basics - Anfänger-Themen 4
C Mergesort Java Basics - Anfänger-Themen 4
H MergeSort (für Anfänger ) Java Basics - Anfänger-Themen 9
N MergeSort Java Basics - Anfänger-Themen 8
M MergeSort - Zahlen verschwinden Java Basics - Anfänger-Themen 2
P MergeSort mit Liste Java Basics - Anfänger-Themen 4
M MergeSort rekursiv Java Basics - Anfänger-Themen 2
B Methoden Natural Mergesort Java Basics - Anfänger-Themen 2
P Mergesort || 2 SetLists mischen Java Basics - Anfänger-Themen 2
P Mergesort (zyklische Liste) Java Basics - Anfänger-Themen 2
X eigener Mergesort auf generischen Typen mit Comparator Java Basics - Anfänger-Themen 6
N MergeSort mit Liste Java Basics - Anfänger-Themen 8
P Probleme bei codierung von MergeSort Java Basics - Anfänger-Themen 4
M MergeSort - Threads in Anwendung bremsen alles! Java Basics - Anfänger-Themen 4
Houly Mergesort Java Basics - Anfänger-Themen 4
M Mergesort Java Basics - Anfänger-Themen 11
C MergeSort Problem Java Basics - Anfänger-Themen 5
B mergesort/rekursion Java Basics - Anfänger-Themen 9
wuerg Türme von Hanoi Iterativ Java Basics - Anfänger-Themen 8
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
R Iterativ zeichnen Java Basics - Anfänger-Themen 1
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
A Rekursion Funktion in eine Iterativ Funktion umwandeln Java Basics - Anfänger-Themen 9
M Werte der Knoten in Binärbaum addieren (iterativ) Java Basics - Anfänger-Themen 6
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
T Methoden Fibunacci Iterativ Java Basics - Anfänger-Themen 6
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
H Suchbaum iterativ absteigen? Java Basics - Anfänger-Themen 3
P Hanoi rekursiv zu iterativ umbauen Java Basics - Anfänger-Themen 20
W Binomialkoeffizient iterativ/rekursiv Java Basics - Anfänger-Themen 2
P QuickSort iterativ Java Basics - Anfänger-Themen 5
M Rekursion Iterativ ausdrücken Java Basics - Anfänger-Themen 3
B Begriff Iterativ Java Basics - Anfänger-Themen 2
J Java Rekursiv vs(zu) Iterativ Hilfe Java Basics - Anfänger-Themen 3
F Sortieralgorithmus von rekursiv auf iterativ? Java Basics - Anfänger-Themen 21
N Fibo Zahlen:iterativ,rekursiv Anzahl der Additionen zählen Java Basics - Anfänger-Themen 2
X Türme von Hanoi - Iterativ Java Basics - Anfänger-Themen 8
T funktion iterativ Java Basics - Anfänger-Themen 4
I Iterativ <-> Rekursiv in Java Java Basics - Anfänger-Themen 11
B von rekursiv zu iterativ Java Basics - Anfänger-Themen 6
Chabub Hilfe bei Stacks und Queue Java Basics - Anfänger-Themen 2
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
L Queue mithilfe von 2 Stacks erstellen Java Basics - Anfänger-Themen 1
M Erstellen eines Stacks Java Basics - Anfänger-Themen 14
D Stacks wohlgeformte Klammerausdrücke Java Basics - Anfänger-Themen 14
N Stacks und Queues Implementieren Java Basics - Anfänger-Themen 2
J Funktionen auf der Rückgabe eines Stacks (pop) Java Basics - Anfänger-Themen 6
Z Programmierung eines Stacks Java Basics - Anfänger-Themen 19
S Funktion eines Stacks Java Basics - Anfänger-Themen 4
G BlueJ Stacks Bahnhof Java Basics - Anfänger-Themen 2
G Werte in Stacks zusammenrechnen Java Basics - Anfänger-Themen 23
M Auf vorletztes Element des Stacks zugreifen? Java Basics - Anfänger-Themen 2
D Inhalte von Stacks miteinander multiplizieren Java Basics - Anfänger-Themen 4
G Stacks Java Basics - Anfänger-Themen 8
P Queue, Stacks, Listen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben