QuickSort - Pivot in der Mitte

cod3r

Mitglied
Hallo zusammen,

ich habe als erstes einen QuickSort-Algorithmus programmiert bei dem das Pivotelement in jedem Aufruf ganz rechts steht. Funktioniert auch soweit. Jetzt wurde mir die Aufgabe gestellt, einen QuickSort-Algorithmus zu erstellen bei dem das Pivotelement bei jedem Aufruf in der Mitte steht. Hier habe ich ein Problem :)

Mein zu sortierendes Array lautet: A = [3,4,7,10,6,8,1,9,2,5]

juti, das Pivotelement lautet: "6"

Code-Snippet:

[JAVA=42]
int A[] = {3,4,7,10,6,8,1,9,2,5};

public static void quicksort (int A[], int li, int re) {


if (li > re) return; /* Falls die ganz linke Position im Array
* kein Folgeelement mehr hat brich ab!
*/
else
{

int k; // Zaehlvariable
int l = 0; // Variable fuer den linken Zeiger
int r = re; // Variable fuer den rechten Zeiger
int tmp; // Variable fuer die Zwischenspeicherung beim Tausch
int pivot = A[(li+re)/2]; // Pivotelement

//-----------------------------------------------------------------------------------//

for (k=0; k<re; k++)
{
while (A[l] <= pivot) {l++;}
while (A[r] >= pivot) {r--;}

if (l>r) break;
else {tmp = A[l]; A[l] = A[r]; A[r] = tmp;}
}
[/code]

[JAVA=42]
quicksort(A,li,pivot-1);
quicksort(A,pivot+1,re);
[/code]

O.K. - wenn ich jetzt den Zeigerdurchlauf nachvollziehe, dann ergibt sich folgendes Bild:
"l läuft bis 7 - r bleibt bei 5" - Tausch
"l läuft bis 10 - r läuft bis 2" - Tausch
"l läuft bis 6 (Pivot) - r läuft bis 1" - ???

Hier ist mein erstes Problem, mein linker Zeiger kommt am Pivotelement an, rechter Zeiger hat aber noch Elemente vor sich.
Wird hier das Pivotelement dann mit dem Element des rechten Zeigers vertauscht?
 
S

SlaterB

Gast
kannst du bitte das funktionierende Quicksort-Programm posten?!
wenn du dort auch nur in einem Array vertauschst, frage ich mich wirklich wie das aufgebaut ist,

ansonsten zwei Wiki-Zitate
Zunächst wird die zu sortierende Liste in zwei Teillisten („linke“ und „rechte“ Teilliste) getrennt. Dazu wählt Quicksort ein sogenanntes Pivotelement aus der Liste aus. Alle Elemente, die kleiner als das Pivotelement sind, kommen in die linke Teilliste, und alle, die größer sind, in die rechte Teilliste. Die Elemente, die gleich dem Pivotelement sind, können sich beliebig auf die Teillisten verteilen. Nach der Aufteilung sind die Elemente der linken Liste kleiner oder gleich den Elementen der rechten Liste.
[..]
Die Längen der Teillisten ergeben sich aus der Wahl des Pivotelements. Idealerweise wählt man das Pivot so, dass sich zwei etwa gleich lange Listen ergeben, dann arbeitet Quicksort am effizientesten. Es sollte also etwa gleich viele Elemente kleiner als das Pivot und größer als das Pivot geben.
Quicksort ? Wikipedia

schon aus diesen einleitenden Sätzen klar, dass du irgendwas anderes programmierst?
du brauchst Teillisten oder musst meinetwegen im Array die Grenze verschieben können,
nur links mit rechts vertauschen ist zu wenig, wie du selber merkst
 

Dekker

Bekanntes Mitglied
Naja ich steige nicht durch die untere Zeile die er geschrieben hat also das zweite Codebeispiel. Ich glaube du hast den Algorithmus bissle falsch verstanden. Seh dir am besten wirklich mal den Wikipedia Pseudocode an. Deinen Pivotalgorithmus benutzt du halt anstelle
Java:
 pivot := daten[rechts]
sowas wie
Java:
 pivot := computePivot()
und in computePivot() berechnest du dann den Index deines Pivotelements.
 
N

NamenVergeben

Gast
Ich zitiere mal Wikipedia:
// Starte mit j links vom Pivotelement
Also ich denke, man nimmt sich das Pivotelement beliebig und vertauscht es mit dem Ende und benutzt dann den bekannten Algorithmus für die Liste davor. Am Schluss wird das Element dann wieder in die Liste "getauscht" und man weiß auch definitiv, wo es sich befindet.

Ansonsten bekommt man eine falsche Sortierung, bleibt in einer Endlosschleife stecken oder braucht zusätzliche Abfragen, so wie ich das sehe...
Wenn es anders eleganter geht, bitte ich um genaue Informationen, wo dies steht. Es interessiert mich auch sehr :)
 

cod3r

Mitglied
Hi :)

Danke für die zahlreichen Antworten. Ja, leider ist es wirklich so, dass das Pivotelement immer in der Mitte sein soll. Das hat auch soweit geklappt nach dem ich mir durch "aufmalen" bewusst gemacht habe wie das abläuft. Den entsprechend funktionierenden Quellcode habe ich angehängt.

Grüße!
 

Anhänge

  • QuickSort_mitte.java
    1,6 KB · Aufrufe: 52
N

NameVergeben

Gast
Danke für deine Rückmeldung.
Scheint zu funktionieren. Bloß, dass du jetzt das Pivotelement doppelt sortierst.
Ist die Frage, ob es dann nicht einfacher ist, einfach das Pivotelement an den Schluss zu tauschen und dann zu sortieren.

Vllt. hätte man sich auch einfach die Position des Pivotelements merken können, um dann den bekannten Algorithmus benutzen zu können.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Quicksort mit Durchschnitt als Pivot Java Basics - Anfänger-Themen 1
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
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
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
P Ziffer in der Mitte ausgeben Java Basics - Anfänger-Themen 12
I In der Mitte eines Frames mit BorderLayout etwas malen Java Basics - Anfänger-Themen 7
D Die Zahl in der Mitte finden Java Basics - Anfänger-Themen 20
M Label in die Mitte eines Swing Fensters Java Basics - Anfänger-Themen 2
K Rechteck mit einem Loch in dem Mitte Java Basics - Anfänger-Themen 11
A Mitte des Bildschirms herausfinden Java Basics - Anfänger-Themen 4
B Vertikale Mitte Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben