Quicksort Algorithmus

gamma21

Mitglied
Ich würde gerne den Quicksort Algorithmus schreiben und habe dazu auch schon viel Code im Netz gefunden, jedoch klappt es bei mir noch nicht.
Code:
    static int quickSort(ArrayList<Integer> numbers, int low, int high) {
        int i = low;
        int j = high;
        int pivot = (numbers.get(i)+numbers.get(j))/2;
        if (i < j) {

            while (i < j) {
                while (numbers.get(i) <= pivot) {
                    i++;
                }
                while (numbers.get(j) > pivot) {
                    j--;
                }
            }
            int temp = numbers.get(i);
            numbers.add(i, numbers.get(j));
            numbers.add(j, temp);
            i++;
            j--;

       }
        if(low<j){
            quickSort(numbers, low, j);}

        if(i<high){
                quickSort(numbers,i, high);
        }
    return 0;
    }
Fehlermeldung bekomme ich keine, jedoch stimmt das Ergebnis nicht.
Fällt jemanden ein Fehler auf?
 

gamma21

Mitglied
Stimmt das wollte ich. Wenn ich aber
Code:
int temp = numbers.get(i);
numbers.set(i, numbers.get(j));
numbers.set(j, temp);
schreibe, komme ich dennoch nicht auf die gewünschte Lösung.
Habe ich irgendwo einen logik Fehler?
 

gamma21

Mitglied
Habe nun die
Code:
if (i < j)
Schleife entfernt. Leider sortiert der Algorithmus immer noch nicht richtig.
Die Eingabewerte low und high sind zu beginn 0 und numbers.size()-1.
Kann keiner weiterhelfen?
 
K

kneitzel

Gast
Also mein Problem ist gerade, dass ich bei Deinem Code den QuickSort Algorithmus nicht erkenne. Zumindest finde ich unter https://de.wikipedia.org/wiki/Quicksort
eine andere Beschreibung.

Und bei Deinem Code kommt es direkt zu einer Endlosschleife in meinen Tests.
Als Eingabe habe ich 9, 5, 1, 3 gegeben. Aufruf ist dann mit 0, 3 als Grenze.
pivot ist dann 6 bei mir
i (0) ist kleiner j (3):
9 ist nicht kleiner gleich 6, also kein i++
3 ist nicht größer 6 also kein j++
==> While wird nicht verlassen.

Also so kann es aus meiner Sicht nicht funktionieren und das ist kein QuickSort Algorithmus.
 

gamma21

Mitglied
Den Alggorithmus habe ich mithilfe dieser Beschreibung versucht umzusetzen.
Ich gehe den Code einmal durch:
Zuerst suche ich mir ein Pivotelement (in meinem Fall nehme ich die Mitte).
Danach vergleiche ich, ob die Elemente kleiner oder größer als das Pivot Element sind. Wenn das Element an der Stelle i kleiner ist als das Pivot Element erhöhe ich i und schaue mir das nächste Element an.
Habe ich einen Wert gefunden der kleiner ist als das Pivot Element vertausche ich dieses mit jenem welches größer ist.
Mein momentaner Code:
Code:
   static int quickSort(ArrayList<Integer> numbers, int low, int high) {
        int i = low;
        int j = high;
      
        int pivot = numbers.get((low +high)/2);

        while(i <= j) {


                while (numbers.get(i) < pivot) {
                    i++;
                }
                while (numbers.get(j) > pivot) {
                    j--;
                }

            if(i<=j) {
                int temp = numbers.get(i);
                numbers.set(i, numbers.get(j));
                numbers.set(j, temp);
                i++;
                j--;
            }

       }
       if(low<j){
            quickSort(numbers, j, low);}

       if(i<high){
                
                quickSort(numbers,i, high);
        }
    return 0;
    }
durchläuft zumindest bei mir keiner Endlosschleife.
Kannst du mir denn nicht zumindest einen Tipp geben, woran es bei mir scheitert?
pivot ist dann 6 bei mir
Wie kommst du darauf? Muss nicht das Pivot Element Teil des Arrays sein?
 

Meniskusschaden

Top Contributor
durchläuft zumindest bei mir keiner Endlosschleife.
Stimmt. Ursprünglich war es aber so.
Kannst du mir denn nicht zumindest einen Tipp geben, woran es bei mir scheitert?
Wenn du die Teilarrays sortieren lässt, solltest du auf korrekte Übergabe der Unter- und Obergrenze achten.
(9+3)/2 = 6
Muss nicht das Pivot Element Teil des Arrays sein?
Ja (Ist es inzwischen auch, war es zum Zeitpunkt des Postings von @kneitzel aber noch nicht).
 
X

Xyz1

Gast
Nabend. Wieso habt ihr nur eine Methode? Ich brauchte, ohne Akrobatik, mindestens drei Methoden...
Java:
import java.util.*;
public class QS {
	public native void swap(ArrayList<Comparable> list, int i, int j);
	void qs1(ArrayList<Comparable> list) {
		qs1(list,0,list.size()-1);
	}
	void qs1(ArrayList<Comparable> list, int l, int r) {
		if (l<r) {
			int t=t(list,l,r);
			qs1(list,l,t-1);
			qs1(list,t+1,r);
		}
	}
	int t(ArrayList<Comparable> list, int l, int r) {
		int i=l, j=r-1, p=r;
		do {
			while (i < r && list.get(i).compareTo(list.get(p))<0)
				i++;
			while (j > l && list.get(j).compareTo(list.get(p))>=0)
				j--;
			if (i<j) {
				Comparable c = list.get(i);
				list.set(i, list.get(j));
				list.set(j, c);
			}
		} while (i<j);
		Comparable c = list.get(i);
		list.set(i, list.get(p));
		list.set(p, c);
		return i;
	}
	public static void main(String[] args) {
		QS q = new QS();
		ArrayList<Comparable> list = new ArrayList<>();
		list.add(4);
		list.add(4);
		list.add(2);
		list.add(2);
		list.add(5);
		list.add(1);
		list.add(6);
		list.add(0);
		q.qs1(list);
		System.out.println(list);
	}
}


public native void swap(ArrayList<Comparable> list, int i, int j); wollte ich eigentlich noch in C schreiben, um zwei Elem ohne Variable zu tauschen, indem die Adressen geswappt werden, um Zeit zu sparen.... aber das war mir wieder zu kompliziert.

Wie es auch sei, so wie es oben steht steht es fast 1:1 bei Wikipedia - und ich denke nicht, das diese sich irren...

(Achtung: Type Safety!!!)
 

gamma21

Mitglied
Wenn du die Teilarrays sortieren lässt, solltest du auf korrekte Übergabe der Unter- und Obergrenze achten.
Danke für den Tipp. Habe nun in
Code:
 if(low<j){
            quickSort(numbers, j, low);}
j und low vertauscht und nun sortiert er wie gewünscht. Danke!
 

Susi123

Aktives Mitglied
Wenn ich folgende Liste nach Quicksort sortieren solle, habe ich das dann richtig verstanden?
Ausgangsliste: 3, 1, 7, 2, 8, 9, 6, 5, 4
3​
1​
7​
2​
8​
9​
6​
5​
4​
1​
2​
3
7​
8​
9​
6​
5​
4​
1​
2​
3
7​
8​
9​
6​
5​
4​
1
2​
3
7​
8​
9​
6​
5​
4​
1
2
3
7​
8​
9​
6​
5​
4​
1
2
3
6​
5​
4​
7
8​
9​
1
2
3
6​
5​
4​
7
8​
9​
1
2
3
5​
4​
6
7
8​
9​
1
2
3
5​
4​
6
7
8​
9​
1
2
3
4​
5
6
7
8​
9​
1
2
3
4
5
6
7
8​
9​
1
2
3
4
5
6
7
8
9
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Quicksort Algorithmus Java Basics - Anfänger-Themen 2
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
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
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
P QuickSort iterativ 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
K Algorithmus entwickeln Java Basics - Anfänger-Themen 1
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
C Gewinnspiel erstellen mit Algorithmus Java Basics - Anfänger-Themen 3
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
H Minimax Algorithmus in Tic Tac Toe Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
ohneInformatik; Trockentest Algorithmus, mathematischen Zusammenhang angeben Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus Java Basics - Anfänger-Themen 17
mervanpolat Binary Search Algorithmus ausführen Java Basics - Anfänger-Themen 1
J Rekursiver Algorithmus Java Basics - Anfänger-Themen 9
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
S Algorithmus entwicklen, der zu einem gegebenen Datum die Jahreszeit ermittelt Java Basics - Anfänger-Themen 13
rosima26 Merge-Algorithmus Java Basics - Anfänger-Themen 53
C Ein Algorithmus soll schneller werden Java Basics - Anfänger-Themen 24
D Dijkstra Algorithmus Hilfe!! Java Basics - Anfänger-Themen 9
U Den Kuchen aufteilen - aber wie? (Rebalancing-Algorithmus) Java Basics - Anfänger-Themen 14
s_1895 Pseudocode Naiver Algorithmus Java Basics - Anfänger-Themen 17
H String verschlüsseln - eigener Algorithmus Java Basics - Anfänger-Themen 104
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
Düsseldorf2002 Testen meines Algorithmus Java Basics - Anfänger-Themen 1
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Algorithmus java searchAll IKey Java Basics - Anfänger-Themen 4
S Algorithmus Datensätze einfügen wenn... Java Basics - Anfänger-Themen 26
KogoroMori21 MergeSort Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
fendix Compiler-Fehler Algorithmus zur Bestimmung von Primzahlen Java Basics - Anfänger-Themen 7
S Algorithmus (reelle Zahl <65536 von dezimal zu dual) max. 10 Nachkommastellen Java Basics - Anfänger-Themen 4
G Algorithmus Graphen Java Basics - Anfänger-Themen 10
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
N Selection Algorithmus: Methode wird nicht erkannt (BlueJ) Java Basics - Anfänger-Themen 3
U Meinung zum Dijkstra Algorithmus Java Basics - Anfänger-Themen 6
U Dijkstra Algorithmus Laufzeit Java Basics - Anfänger-Themen 3
L Math.exp also eigenen Algorithmus Java Basics - Anfänger-Themen 2
Kirby.exe Algorithmus entwickeln Java Basics - Anfänger-Themen 37
M Algorithmus Max-Heap? Java Basics - Anfänger-Themen 3
I Labyrinth auf der Basis eines rekursiven Algorithmus Java Basics - Anfänger-Themen 27
CptK Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren Java Basics - Anfänger-Themen 3
A Algorithmus effizienter machen Java Basics - Anfänger-Themen 1
V Algorithmus zur fortlaufenden Berechnung des duechscjnt Java Basics - Anfänger-Themen 1
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
O Labyrinth Algorithmus Java Basics - Anfänger-Themen 3
S Binäre-Suche Algorithmus Java Basics - Anfänger-Themen 1
D Algorithmus in Pseudocode mit log2(n) Operationen erstellen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben