QuickSort iterativ

pilx

Mitglied
Bin dabei den QuickSort Algorithmus iterativ mit Hilfe von Stacks (Kellern) zu schreiben. Es funktioniert auch soweit ganz gut. Hin und wieder aber wird falsch sortiert. Ich bin mir sicher, dass ich k.pop() falsch gesetzt habe. Wenn ja, mir ist schleierhaft, wo das hingehört. Wenn nein, was könnte sonst falsch sein!?

Java:
public class QuickSortIterativ {

	public static void sort(int[] zahlen) {
		
		//neue Grenzen Objekte
		Grenzen menge = new Grenzen();
		Grenzen neueMenge = new Grenzen();
		
		Grenzen.untereGrenze = 0;
		Grenzen.obereGrenze = (zahlen.length-1);
		
		Keller k = new VerweisKeller();
		
		k.push(menge);
		
		int tmp;
		int i;
		int j;
		int mitte;
		int x;
		
		//solange der Keller nicht leer ist, soll sortiert werden
		do {
			
			//Casten da menge vom Typ Grenzen und k.top vom Typ Object
			menge =(Grenzen) k.top();
                        k.pop();
			
			i = menge.untereGrenze;
			j = menge.obereGrenze;
			mitte = (i+j) / 2;
			x = zahlen[mitte];
			
			do {
				while(zahlen[i] < x) i++;
				while(zahlen[j] > x) j--;
				if(i <= j) {
					tmp = zahlen[i];
					zahlen[i] = zahlen[j];
					zahlen[j] = tmp;
					i++;
					j--;
				}
			} while(i <= j);
			
			//linke Haelfte sortieren
			if(menge.untereGrenze < j) {
				
				//Grenzen fuer diese Haelfte anpassen
				neueMenge.untereGrenze = menge.untereGrenze;
				neueMenge.obereGrenze = j;
				//neue Grenzen auf den Keller legen
				k.push(neueMenge);
				
			}

			//rechte Haelfte sortieren
			if(i < menge.obereGrenze) {
				
				//Grenzen fuer diese Haelfte anpassen
				neueMenge.untereGrenze = i;
				neueMenge.obereGrenze = menge.obereGrenze;
				//neue Grenzen auf den Keller legen
				k.push(neueMenge);
				
			} 
		} while(!k.empty());
	}
}

Java:
public class Grenzen {

	public static int untereGrenze;
	public static int obereGrenze;
	
}
 
Zuletzt bearbeitet:
A

asdasdjk

Gast
wenn du eine rekursive version hast, kannst du die andere genauso schreiben, indem du die parameter einfach übernimmst und diese kellerst...
 

tagedieb

Top Contributor
Ich hab den Code mal rasch ueberflogen. Deine Grenzen Klasse ist falsch implementiert.
Die Variablen
Code:
untereGrenze
und
Code:
obereGrenze
sollte nicht static deklariert werden, sonst macht es gar keinen Sinn 2 Instanzen von Grenzen zu erzeugen wenn du nur statische Variablen hast.

Solche Zuweisungen von statischen Variablen sind sinnlos. Da kannst du auch irgendwo
Code:
i = i;
schreiben.

Java:
                neueMenge.untereGrenze = menge.untereGrenze;


Wenn du ein neues Grenzobjekt in den Keller legen willst musst du eine neue Instanz am Besten mit
Code:
new Grenzen(untereGrenze, obereGrenze)
erzeugen. Ansonsten legst du immer wieder diesebe Instanz in den Keller. Immer wenn du ein Wert einer Instanz aenderst, werden sich auch die Werte der andern 'Instanzen' aendern, da es ja dieselbe Instanz ist.

Java:
                //Grenzen fuer diese Haelfte anpassen
                //neueMenge.untereGrenze = menge.untereGrenze;
                //neueMenge.obereGrenze = j;
                //neue Grenzen auf den Keller legen
                k.push(new Grenzen(menge.untereGrenze, j));

Ich hoffe das bringt dich ein wenig weiter.
 

pilx

Mitglied
Vielen, vielen Dank.
Habe es jetzt wie folgt gemacht und es funktioniert hervorragend

Java:
public class QuickSortIterativ {

	public static void sort(int[] zahlen) {
		
		//neue Grenzen Objekte
		Grenzen menge = new Grenzen(0, zahlen.length-1);
		
		Keller k = new VerweisKeller();
		
		k.push(menge);
		
		int tmp;
		int i;
		int j;
		int mitte;
		int x;
		
		//solange der Keller nicht leer ist, soll sortiert werden
		while(!k.empty()) {
			
			//Casten da menge vom Typ Grenzen und k.top vom Typ Object
			menge =(Grenzen) k.top();
			k.pop();
			
			i = menge.untereGrenze;
			j = menge.obereGrenze;
			mitte = (i+j) / 2;
			x = zahlen[mitte];
			
			do {
				while(zahlen[i] < x) i++;
				while(zahlen[j] > x) j--;
				if(i <= j) {
					tmp = zahlen[i];
					zahlen[i] = zahlen[j];
					zahlen[j] = tmp;
					i++;
					j--;
				}
			} while(i <= j);
			
			//linke Haelfte sortieren
			if(menge.untereGrenze < j) {
				
				//neue Grenzen auf den Keller legen
				k.push(new Grenzen(menge.untereGrenze, j));
				
			}
			
			//rechte Haelfte sortieren
			if(i < menge.obereGrenze) {
				
				//neue Grenzen auf den Keller legen
				k.push(new Grenzen(i, menge.obereGrenze));
				
			}
		}
	}
}

und die Grenzen
Java:
public class Grenzen {
  
  int untereGrenze;
  int obereGrenze;

  public Grenzen(int untereGrenze, int obereGrenze) {

    this.untereGrenze = untereGrenze;
    this.obereGrenze = obereGrenze;
	}
}
 
A

asdasdjk

Gast
eine klasse java.awt.Point würde es bereits geben, um die obere und unter grenze zu speichern und zu manipulieren
oder einfach ein new int[2] :)
 

pilx

Mitglied
Stehe ja in Java noch ganz am Anfang. Um die Konzepte besser zu verstehen usw. ist es wahrscheinlich doch besser sich nicht alles von Java zu importieren oder nicht?
Btw: gibt es in Java eigentlich auch eine Klasse, die für mich nach Quicksort (bzw. anderen Methoden) sortiert? Der ich dann einfach ein Array, Liste oder was auch immer übergebe und sie mir die sortierten Werte zurück gibt?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Java Quicksort PAP Java Basics - Anfänger-Themen 2
B Quicksort in Verbindung mit einem Projekt Java Basics - Anfänger-Themen 1
M QuickSort und Liste Java Basics - Anfänger-Themen 6
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
G Quicksort Algorithmus Java Basics - Anfänger-Themen 12
Hanschyo Quicksort sortiert von groß nach klein Java Basics - Anfänger-Themen 3
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
L Quicksort verstehen Java Basics - Anfänger-Themen 3
M Quicksort Laufzeit langsam Java Basics - Anfänger-Themen 5
M Quicksort Laufzeit langsam Java Basics - Anfänger-Themen 0
J Quicksort mit Stack Java Basics - Anfänger-Themen 4
Liondary Quicksort Java Basics - Anfänger-Themen 20
K Quicksort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
S Quicksort Algorithmus Java Basics - Anfänger-Themen 2
D Java Quicksort Java Basics - Anfänger-Themen 5
A Frage zu QuickSort Java Basics - Anfänger-Themen 9
B Quicksort mit Durchschnitt als Pivot Java Basics - Anfänger-Themen 1
K Quicksort Java Basics - Anfänger-Themen 3
M Quicksort - Probleme Java Basics - Anfänger-Themen 5
T QuickSort implementieren Java Basics - Anfänger-Themen 5
R QuickSort Verständis Problem (?) Java Basics - Anfänger-Themen 2
M Quicksort implementierung Java Basics - Anfänger-Themen 23
E Quicksort Java Basics - Anfänger-Themen 8
Xendarii Quicksort gibt kein Ergebnis aus Java Basics - Anfänger-Themen 13
E QuickSort: Ergebniss speichern Java Basics - Anfänger-Themen 2
P quickSort eines Objekt-Arrays geht nicht! Java Basics - Anfänger-Themen 11
F Stackoverflow bei Quicksort Java Basics - Anfänger-Themen 2
F Quicksort Java Basics - Anfänger-Themen 22
C Quicksort Invariante Java Basics - Anfänger-Themen 2
C QuickSort - Pivot in der Mitte Java Basics - Anfänger-Themen 5
K Eine Frage zum Quicksort Java Basics - Anfänger-Themen 11
B Quicksort --> Methodenaufruf Java Basics - Anfänger-Themen 10
B QuickSort - Fehler nicht zu finden Java Basics - Anfänger-Themen 2
W Quicksort Problem Java Basics - Anfänger-Themen 3
A Quicksort, #Vergleiche zählen klappt nicht Java Basics - Anfänger-Themen 3
J Quicksort Implementierung-- Exception ArrayOutOfBounds Java Basics - Anfänger-Themen 6
M Fehler in meinem Quicksort! Java Basics - Anfänger-Themen 21
B Quicksort Struktogramm Java Basics - Anfänger-Themen 9
G Frage zu Quicksort Java Basics - Anfänger-Themen 18
0 Quicksort bsp Java Basics - Anfänger-Themen 5
B Quicksort Problem Java Basics - Anfänger-Themen 6
S Mein Quicksort Problem: he method quickSort(int[], int, int) Java Basics - Anfänger-Themen 2
M Quicksort Java Basics - Anfänger-Themen 2
C Quicksort raten Java Basics - Anfänger-Themen 2
K ArrayList sortieren mit Quicksort Java Basics - Anfänger-Themen 3
M Quicksort Java Basics - Anfänger-Themen 4
J Quicksort programmieren Probleme Java Basics - Anfänger-Themen 9
S Quicksort Programm Java Basics - Anfänger-Themen 7
D Quicksort Java Basics - Anfänger-Themen 3
K Parameterübergabe bei quickSort Java Basics - Anfänger-Themen 6
S QuickSort will mir nicht in den Kopf (an einer Stelle) Java Basics - Anfänger-Themen 14
0 Quicksort Java Basics - Anfänger-Themen 2
M QuickSort Java Basics - Anfänger-Themen 4
J QuickSort - kurze Frage Java Basics - Anfänger-Themen 9
H Quicksort und Rekursiv: Türme von Hanoi 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
I MergeSort iterativ mit Stacks Java Basics - Anfänger-Themen 13
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
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
F MergeSort iterativ mit Hilfe von Stack Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben