Sortieralgorithmus von rekursiv auf iterativ?

Status
Nicht offen für weitere Antworten.
F

Frager

Gast
Folgende Aufgabe:

Ich soll einen Sortieralgorithmus schreiben, der erst die 1.2-drittel, dann die 2.2-drittel und dann wieder die 1. 2-drittel sortiert.

rekursiv war des kein problem, nun sollen die anfangs und endwerte in einem keller gespeichert werden, da bin ich schon fast am ziel.

nur ist mir nciht klar, wie ich das dann sortieren soll? also wenn ich so lange werte im keller speicher bis sich anfang und ende des teilbereichs nur noch um max 1 unterscheiden kann ich natürlich das sortieren, sind dann ja 2 ints. aber dann kommt ausm keller ja sowas wie zb 2 und 5 also mit 4 zahlen, wovon jeweils 2 pärchen sortiert sind, was soll cih dann da sortieren?

Das macht für mcih alles keinen sinn
 

hdi

Top Contributor
nun sollen die anfangs und endwerte in einem keller gespeichert werden

Was genau meinst du damit? Welche Anfangs- und Endwerte? Also Stoogesort ist eigentlich
ein rekursiver Algorithmusm, iterativ heisst ja quasi nur schrittweise ohne Wiederaufrufen der Funktion.
Also in einer Art while-Schleife, denk ich jetz, aber steh auch grad etwas neben mir hier :autsch:
Ich versteh nich was du mit diesem "Keller" willst?
 
G

Gast

Gast
achso, der keller muss eingebaut werden, ist teil der aufgabe.
Anstatt des Rekursionsaufrufs werden in einer Schleife die beiden Grenzen der noch zu sortierenden Teilfolgen bis zur Weiterverarbeitung in einem Keller abgelegt. Sie werden bei Bedarf wieder herausgeholt. Auf diese Art und Weise wird der Laufzeitkeller der Rekursion nachgebildet.

also muss ich erstmal den keller mit werten füllen, die dann wieder rausholen und damit dann i-wie sortieren...
 

mahe

Aktives Mitglied
Wenn Deine Funktion endrekursiv ist, brauchst Du lediglich die Parameter der Rekursionsaufrufe im Stack ablegen und den Funktionsrumpf so umschreiben, dass er den Stack abarbeitet. Die Abbruchbedingungen beenden dann nicht die Funktion sondern lediglich diesen Schleifendurchlauf.

Da ich für den anderen Thread schon mal ein Triple-Sort geschrieben hatte (und weil ich nicht schlafen kann ;)), hier auch in iterativer Variante:
Code:
class TripleSort {

	public static void sortIt(int[] numbers) {
		Stack<Integer> sStart = new Stack<Integer>();
		Stack<Integer> sLength = new Stack<Integer>();
		sStart.push(0);
		sLength.push(numbers.length);

		while(!sStart.isEmpty()) {
			int start  = sStart.pop();
			int length = sLength.pop();

			if (length < 2) {
				continue;
			} else if (length == 2) {
				if (numbers[start] > numbers[start+1]) {
					switchNr(numbers, start, start+1);
				}
				continue;
			}

			int third = length/3;
			int twoThirds = length-third;

			sStart.push(start);
			sLength.push(twoThirds);

			sStart.push(start+third);
			sLength.push(twoThirds);

			sStart.push(start);
			sLength.push(twoThirds);
		}
	}

	public static void sortRek(int[] a) {
		sortRek(a, 0, a.length);
	}

	private static void sortRek(int[] numbers, int start, int length) {
		if (length < 2) {
			return;
		} else if (length == 2) {
			if (numbers[start] > numbers[start+1]) {
				switchNr(numbers, start, start+1);
			}
			return;
		}

		int third = length/3;
		int twoThirds = length-third;
		
		sortRek(numbers, start, twoThirds);
		sortRek(numbers, start+third, twoThirds);
		sortRek(numbers, start, twoThirds);
	}

	private static void switchNr(int[] numbers, int a, int b) {
		int t = numbers[b];
		numbers[b] = numbers[a];
		numbers[a] = t;
	}
}

Selbverständlich würde ein Stack ausreichen, zur Verdeutlichung hier aber zwei.
 
G

Gast

Gast
ist das nicht auch wieder rekursiv? du rufst ja in der sortRek wieder sortRek auf... man soll es aber mit ner while-schleife machen, gerade das versteh ich ja nicht :(
 

mahe

Aktives Mitglied
Da ist sowohl die rekursive als auch die iterative Version in der Klasse (damit Du siehst wie das funktioniert).
sortRek ist rekursiv und sortIt ist iterativ (mit while-Schleife).
sortIt ruft lediglich die switch-Funktion auf welche die Werte vertauscht.

Der Algorithmus ist in beiden Versionen exakt derselbe.
 
G

Gast

Gast
hmm, ok, nun uss ich ja die stacvks noch in "unsere" keller umschreiben, beim compilieren gibt er folgende fehlermeldung

need int but found void an der stelle

int start = sStart.pop();

habs versucht so zu casten:

int start = (Integer)sStart.pop();

aber dat geht auch net :(
 

Ebenius

Top Contributor
Wenn auch langsam: Hier nochmal die Implementierung mit nur einem Stack:
Code:
@SuppressWarnings("boxing")
private static void sortIterative(int[] array) {
  final Stack<Integer> stack = new Stack<Integer>();
  stack.push(array.length - 1);
  stack.push(0);
  do {
    int start = stack.pop();
    int end = stack.pop();
    if (array[start] > array[end]) {
      flip(array, start, end);
    }

    if (start + 1 < end) {
      final int k = (end - start + 1) / 3;
      stack.push(end - k);
      stack.push(start);
      stack.push(end);
      stack.push(start + k);
      stack.push(end - k);
      stack.push(start);
    }
  } while (!stack.isEmpty());
}

private static void flip(int[] a, int i, int j) {
  final int e = a[i];
  a[i] = a[j];
  a[j] = e;
}

Ebenius
 
G

gast

Gast
habs jetzt so umgeschrieben, aber hängt beim ausführen in ner endlosschleife :(

Code:
import AlgoTools.IO;
public class TripleSortIterativ{
    public static void sort(int[] numbers) {
      Keller sStart = new VerweisKeller();
      Keller sLength = new VerweisKeller();
      sStart.push(0);
      sLength.push(numbers.length);

      while(!sStart.empty()) {
         int start  = (Integer)sStart.top();
         int length = (Integer)sLength.top();

         if (length < 2) {
            continue;
         } else if (length == 2) {
            if (numbers[start] > numbers[start+1]) {
               switchNr(numbers, start, start+1);
            }
            continue;
         }

         int third = length/3;
         int twoThirds = length-third;

         sStart.push(start);
         sLength.push(twoThirds);

         sStart.push(start+third);
         sLength.push(twoThirds);

         sStart.push(start);
         sLength.push(twoThirds);
      }
   } 
   private static void switchNr(int[] numbers, int a, int b) {
      int t = numbers[b];
      numbers[b] = numbers[a];
      numbers[a] = t;
   } 
}
 
G

Gast

Gast
also das mit 2en funktioniert ^^ werd mir jetzt nochmal alles anschauen und auf der basis von den 2 beispielen was eigenes konstruieren, aber ich danke euch 2en schonmalganz herzlichst, habt mir den tag(oder die nacht^^) gerettet
 

Leroy42

Top Contributor
Ebenius hat gesagt.:
Du musst natürlich auch noch pop() aufrufen nach dem top().

... also:

Code:
         int start  = (Integer)sStart.top(); sStart.pop();
         int length = (Integer)sLength.top(); sLength.pop();

Edit: Huch! :shock: Mal wieder verpennt, daß es schon eine zweite Seite gab! :oops:
 

mahe

Aktives Mitglied
Wo ist diese Uni (?) überhaupt?

Wenns nicht zu weit weg ist komme ich zur Klausur.
Genug Punkte müsste ich inzwischen ja haben :wink:
 

nohfreak

Mitglied
Osnabrück. :D

Aber wenn er sich hier weiterhin alles vorsagen lässt wird er wohl in der Klausur Probleme bekommen, ich hab heute paar alte KLausuren gesehen. :>
 

mahe

Aktives Mitglied
Oje, das ist mir doch zu weit: Strecke

Wenn es alte Klausuren zur Einicht gibt kann man die Programme ja auswendig lernen.
So haben sich bei uns schon einige durchgemogelt :lol:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Sortieralgorithmus - Aufgabe mit Lösungsidee Java Basics - Anfänger-Themen 20
L Sortieralgorithmus Java Basics - Anfänger-Themen 17
2 Erste Schritte Sortieralgorithmus Array Java Basics - Anfänger-Themen 6
D Sortieralgorithmus mit Systemzeit messen Java Basics - Anfänger-Themen 7
K Sortieralgorithmus Java Basics - Anfänger-Themen 10
Messoras Sortieralgorithmus graphisch darstellen Java Basics - Anfänger-Themen 6
M BubbleSort (Sortieralgorithmus) Java Basics - Anfänger-Themen 28
C Sortieralgorithmus grafisch darstellen Java Basics - Anfänger-Themen 3
Streeber Sortieralgorithmus Java Basics - Anfänger-Themen 8
G Sortieralgorithmus mit Rekursion funktioniert nicht Java Basics - Anfänger-Themen 26
S Hilfe zu einfachstem Sortieralgorithmus gesucht Java Basics - Anfänger-Themen 2
N sortieralgorithmus Java Basics - Anfänger-Themen 32
R Frage zu Sortieralgorithmus Java Basics - Anfänger-Themen 13
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
B Fibonacci Zahlen rekursiv Array Java Basics - Anfänger-Themen 12
M String rekursiv Spiegeln mit Originalwort davor Java Basics - Anfänger-Themen 3
K Türme von Hanoi - Rekursiv. Java Basics - Anfänger-Themen 1
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
M Zahlenpyramide rekursiv programmieren Java Basics - Anfänger-Themen 7
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
D Münzverteilung Möglichkeiten | Rekursiv Java Basics - Anfänger-Themen 3
R Hanoi rekursiv lösen Problem Java Basics - Anfänger-Themen 1
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
shiroX OOP String rekursiv zurückgeben Java Basics - Anfänger-Themen 6
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
E Erste Schritte Pi, rekursiv Java Basics - Anfänger-Themen 6
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5
E Hanoi-Varianten rekursiv Java Basics - Anfänger-Themen 2
P Hanoi rekursiv zu iterativ umbauen Java Basics - Anfänger-Themen 20
P Mittelwert rekursiv Java Basics - Anfänger-Themen 13
E Integral Rekursiv Java Basics - Anfänger-Themen 15
M MergeSort rekursiv Java Basics - Anfänger-Themen 2
D Ziffer in Zahl Rekursiv Java Basics - Anfänger-Themen 4
B Array rekursiv untersuchen Java Basics - Anfänger-Themen 21
I Rekursiv Java Basics - Anfänger-Themen 13
C Rekursiv Zahlenfolgen berechnen mit zwei Variablen Java Basics - Anfänger-Themen 5
K Rekursiv zu Literal Java Basics - Anfänger-Themen 12
R Verzeichnisse rekursiv nach Dateiduplikaten durchsuchen Java Basics - Anfänger-Themen 5
L File Tree rekursiv Java Basics - Anfänger-Themen 10
W Binomialkoeffizient iterativ/rekursiv Java Basics - Anfänger-Themen 2
X Addition rekursiv ohne Schleife Java Basics - Anfänger-Themen 10
M Sudoku Rekursiv lösen Java Basics - Anfänger-Themen 9
E Datentypen ein java problem rekursiv loesen Java Basics - Anfänger-Themen 2
K indexOf selbst rekursiv definieren Java Basics - Anfänger-Themen 4
M Fibonacci-Linear und Rekursiv Java Basics - Anfänger-Themen 14
J Java Rekursiv vs(zu) Iterativ Hilfe Java Basics - Anfänger-Themen 3
D preOrder, inOrder, postOrder rekursiv zusammensetzen aus String Java Basics - Anfänger-Themen 1
K Binomialkoeffizient rekursiv berechnen Java Basics - Anfänger-Themen 8
J eulersche rekursiv berechnen Java Basics - Anfänger-Themen 6
J Suchbaumeigenschaft rekursiv programmieren Java Basics - Anfänger-Themen 3
T Rekursiv Vokale zählen Java Basics - Anfänger-Themen 19
G Bestimmte Ebene eines Baumes rekursiv ausgeben Java Basics - Anfänger-Themen 49
G Sudoku rekursiv lösen Java Basics - Anfänger-Themen 10
S Stringlänge Rekursiv ermitteln Java Basics - Anfänger-Themen 2
dognose Verzeichnis rekursiv auslesen / beschränkte Apis. Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben