Quick Sort - bin ich zu blöd?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hey Leute... also nachdem ich jetzt schon seit über einer Woche dran sitze und den Fehler suche hab ich mich entschlosse das ganze mal hier zu posten...
Also ich habe den QuickSort - Algorithmus von Wikipedia in Java umgesetzt (also den Pseudocode)
Siehe: http://de.wikipedia.org/wiki/Quicksort
Eigentlich war dabei kein Problem... den Algorithmus an sich habe ich verstanden und auch sonst war eigentilch alles easy ;)
Natürlich wollte ich das ganze auch testen und habe gleich ein Programm dazu geschrieben... im Average-Case (also wenn das Feld zufällige Zahlen beinhaltet) klappt alles super... die Zahlen werden richtig sortiert und alles ist bestens...

Das Problem taucht jetzt komischerweise beim Best-Case auf (wenn alle Zahlen in der richtigen Reihenfolge sind...)
Ich kann das Feld mit den Zahlen nicht größer als 10000 machen, da mir Java ansonsten die Fehlermeldung:

Exception in thread "main" java.lang.StackOverflowError

ausgibt... ich bin echt am verzweifeln, das macht er nämlich nur beim Best-Case... ich häng mal mein Code an...

Die Methode QuickSort...
Code:
	public static int[] QuickSort (int daten[],int links,int rechts) {
		if (links < rechts) {
			int teiler = teile (daten,links,rechts);
			QuickSort (daten,links,teiler-1);
			QuickSort (daten,teiler+1,rechts);
		}
		return daten;
	} //QuickSort

Die Methode teile
Code:
	private static int teile (int daten[],int links,int rechts) {
		int i = links;
		int j = rechts-1;
		int pivot = daten[rechts];
		
		while (i < j) {
			while ((daten[i]<=pivot) && (i<rechts)) 
				i++;
			
				
			while ((pivot<=daten[j])&& (j>links)) 
				j--;
				
			if (i<j) 
				Swap (daten,i,j);	
		}
		if (daten[i]>pivot)
			Swap (daten,i,rechts);
		return i;
	}

Die Methode Swap vertauscht zwei Felder miteinander
Code:
	private static int[] Swap (int daten[], int eins, int zwei) {
		
		int hilfe=daten[eins];
		daten[eins] = daten[zwei];
		daten[zwei] = hilfe;
		return daten;
	}

Aus der Main-Methode wird QuickSort aufgerufen... hier zwei Auszüge aus meiner Main-Methode, die die Feldbelegung verdeutlichen, sowie den Aufruf der Methode QuickSort

Code:
		int[] feld; 
		feld = new int[10000];
		for (int i=0;i<=feld.length-1;i++)
			feld[i]=i;
		feld = QuickSort(feld,0,feld.length-1);

Hat irgendwer eine Ahnung wo sich der Fehler versteckt hat?! Ich wär demjenigen echt so dermaßen dankbar... :)
 

tfa

Top Contributor
Anonymous hat gesagt.:
Das Problem taucht jetzt komischerweise beim Best-Case auf (wenn alle Zahlen in der richtigen Reihenfolge sind...)
Ich kann das Feld mit den Zahlen nicht größer als 10000 machen, da mir Java ansonsten die Fehlermeldung:

Exception in thread "main" java.lang.StackOverflowError
Wenn du mit diesem Algorithmus ein sortiertes Array sortieren willst, wird Quicksort zum Slowsort. D.h. die Rekursionstiefe wächst mit n (also hier 10000). Und irgendwann ist der Stack voll und fliegt dir um die Ohren.
Den Stack zu vergrößern würde das Problem nicht lösen sondern nur später auftreten lassen.
Wähle das Pivot-Element besser (du nimmst immer das erste, fatal bei einer sortierten Liste). Du könntest z.B. das mittelgroße des ersten, letzten und mittleren Elements nehmen. Die Quicksort-Implementierung der Java-API nimmt sogar das mittlere von 9 gleichmäßig über das Array verteile Elemente, aber das halte ich für übertrieben.
 

Landei

Top Contributor
Das ist nicht der "best case", sondern der "worst case": Beim Teilen bekommst du immer auf der einen Seite ein Intervall der Länge eins, und auf der anderen Seite den Rest. Beim Rest dasselbe ad infinitum. Da du die Methode rekursiv aufrufst, gibt es halt irgendwann einen Stack Overflow. Eine Möglichkeit, das "durchschnittliche" Verhalten zu verbessern, ist das Pivot-Element zufällig auszuwählen. Um einen Stack Overflow zu vermeiden, müsstest du statt der Rekursion eine Schleife nehmen, aber das ist in diesem Fall ziemlich unbequem.

Einige Sprachen vermeiden übrigens in vielen Fällen einen Stack Overflow durch sogenannte Tail Call (Recursion) Optimization - aber Java eben leider nicht.
 

Leroy42

Top Contributor
Landei hat gesagt.:
Einige Sprachen vermeiden übrigens in vielen Fällen einen Stack Overflow durch sogenannte Tail Call (Recursion) Optimization - aber Java eben leider nicht.

Wie soll das denn bei Quicksort gehen? :shock:

Quicksort kann gar nicht endrekursiv sein, da es immer 2 rekursive Aufrufe
pro Rekursionsebene gibt. :noe:

Hier noch mal eine Erklärung der Endrekursion
 
G

Guest

Gast
So ich habe jetzt die Zeile
Code:
int pivot = daten[rechts];
aus der Methode teile
abgewandelt in
Code:
int pivot = daten[rechts/"];
sodass er hier das pivot Element immer als Mitte wählt...
Positiv anzumerken ist, dass er es hier immerhin bis zu einer Feldgröße von ungefähr 15000 schafft... aber immer noch zu wenig... Ich muss bis zu einer Feldgröße von 100.000 kommen...
Kann ich das Pivot-Element noch geschickter wählen?!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Quick Sort - Vergleichsoperationen zählen Java Basics - Anfänger-Themen 0
M Quick Sort Java Basics - Anfänger-Themen 4
M Methoden Quick Sort Java Basics - Anfänger-Themen 5
emreiu Formatiertes Output bei Insertion Sort Java Basics - Anfänger-Themen 6
O Sortieren mit Insertion Sort Java Basics - Anfänger-Themen 3
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
L Insertion Sort bei zweidimensionalem Array Java Basics - Anfänger-Themen 7
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
G Insertion Sort mit Aray Java Basics - Anfänger-Themen 5
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
O Insertion Sort Java Basics - Anfänger-Themen 4
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
V Heap-Sort Java Basics - Anfänger-Themen 0
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
B Strings alphabentisch sortieren mit Hilfe von insertion sort Java Basics - Anfänger-Themen 6
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
D Insertion sort auf eine liste Java Basics - Anfänger-Themen 4
X Counting Sort Java Basics - Anfänger-Themen 5
P Problem mit Insertion Sort Java Basics - Anfänger-Themen 4
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
hedges Insertion Sort Algorithmus problem Java Basics - Anfänger-Themen 18
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
Drinkerbell Erste Schritte Zu blöd zum Programmieren? Java Basics - Anfänger-Themen 9
S bin zu blöd für threads - wait, notify, synchronized Java Basics - Anfänger-Themen 11
G zu blöd für switch case? Java Basics - Anfänger-Themen 6
M Bin ich echt zu blöd? Java Basics - Anfänger-Themen 24
R bin zu blöd : getCountry() von Locale Java Basics - Anfänger-Themen 3
T zu Blöd für Durchschnittsrechnen Java Basics - Anfänger-Themen 5
N Set + Iterator oder doch nur zu blöd API zu lesen Java Basics - Anfänger-Themen 32
T zu Blöd für jar . Java Basics - Anfänger-Themen 25
Q [javac] Zu blöd für -classpath? Java Basics - Anfänger-Themen 2
R Zu blöd für System.getProperty(path.separator) ? Java Basics - Anfänger-Themen 3
E irgendwie bin ich zu blöd... Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben