Quicksort-Algorithmus - zufälliges Pivot wählen

Zrebna

Bekanntes Mitglied
Hi!

Ich frage mich, wie man den QuickSort-ALG implementieren kann, indem man für das Pivot-Element ein zufälliges Element wählt,
statt z.B. einfach das erste oder letzte Element eines Arrays als Pivot festzulegen?

So geht es schon mal nicht:
Java:
import java.util.Random;

public class QuickSortWithRandomPivot {
    public static void main(String[] args) {
      //  Random ran = new Random();

        int[] array = {34, 45, 12, 34, 23, 18, 38, 17, 43, 51};
   //     int first = ran.nextInt(array.length - 1);
        // first = ran.nextInt(last - first) + first;
        int first = 0;
        int last = array.length-1;

        quickSort(array, first, last);
        for(int i = 0; i < array.length; i++) {
            if(i == array.length - 1) {
                System.out.println(array[i]);
                break;
            }
            System.out.print(array[i] + ", ");
        }
    }

    private static void quickSort(int[] arr, int first, int last) {
        int part = 0; // separation value


        if(first < last) {
            part = PreparePartition(arr, first, last, part);

            quickSort(arr, first, part-1);
            quickSort(arr, part+1, last);
        }
    }

    private static int PreparePartition(int[] arr, int first, int last, int part) {
        Random ran = new Random();
        int pivotIndex = ran.nextInt(arr.length - 1);

        int pivot = arr[pivotIndex];
        part = first-1;


        for(int i = first; i <= last; i++) {
            if(arr[i] <= pivot) {
                part++;
                // swapping
                int temp = arr[part];
                arr[part] = arr[i];
                arr[i] = temp;
            }
        }
        // swapping
        int temp = arr[part];
        arr[part] = arr[first];
        arr[first] = temp;

        return part;
    }
}

Ich weiß nicht, wo ich genau das zufällige Pivot-Element vergeben muss, damit das gesamte Array sortiert wird und nicht nur Teile davon...
Kann Jemand helfen?

Lg
Zrebna
 
K

kneitzel

Gast
Wenn Du das Array von first (Parameter) bis last (Parameter) sortieren willst, dann muss das Pivot-Element doch in diesem Bereich liegen.
Du wählst es aber derzeit beliebig aus dem ganzen Array - und das ist natürlich falsch.

Und der Parameter part sieht auch dubios aus, denn egal was du übergibst: Der Wert wird sofort überschrieben ...
 

Zrebna

Bekanntes Mitglied
Ja, stimmt - habe es nochmal überarbeitet:

Java:
import java.util.Random;

public class QuickSortWithRandomPivot {
    public static void main(String[] args) {
      //  Random ran = new Random();

        int[] array = {34, 45, 12, 34, 23, 18, 38, 17, 43, 51};
   //     int first = ran.nextInt(array.length - 1);
        // first = ran.nextInt(last - first) + first;
        int first = 0;
        int last = array.length-1;

        quickSort(array, first, last);
        for(int i = 0; i < array.length; i++) {
            if(i == array.length - 1) {
                System.out.println(array[i]);
                break;
            }
            System.out.print(array[i] + ", ");
        }
    }

    private static void quickSort(int[] arr, int first, int last) {
        int part = 0; // separation value


        if(first < last) {
            part = preparePartition(arr, first, last, part);

            quickSort(arr, first, part-1);
            quickSort(arr, part+1, last);
        }
    }



    private static int preparePartition(int[] arr, int first, int last, int part) {
        random(arr,first,last);

        int pivot = arr[first];
        part = first-1;


        for(int i = first; i <= last; i++) {
            if(arr[i] <= pivot) {
                part++;
                // swapping
                int temp = arr[part];
                arr[part] = arr[i];
                arr[i] = temp;
            }
        }
        // swapping
        int temp = arr[part];
        arr[part] = arr[first];
        arr[first] = temp;

        return part;
    }

    private static void random(int[] arr, int first, int last) {
        Random ran = new Random();
        int pivot = ran.nextInt(last - first) + first;

        int temp = arr[pivot];
        arr[pivot] = arr[first];
        arr[first] = temp;
    }
}

Passt nun - gucke es mir aber noch im Debugger in Ruhe an, um alles besser nachvollziehen zu können...
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Java:
            quickSort(arr, first, part-1);
            quickSort(arr, part+1, last);

Du sortiert also von 0-3 und 5-8? Was ist mit der 4 (part)?

Wäre jetzt so ein Punkt, der mit ins Auge fällt.
 

Zrebna

Bekanntes Mitglied
So wie ich es aus der Vorlesung verstanden habe, ist diese "Lücke" quasi der Trennwert, der bereits einsortiert ist...also vorher...
 
K

kneitzel

Gast
Sorry für die späte Antwort. Du hast das natürlich richtig verstanden und ich habe mich in dem Punkt vertan. (Sowas passiert leider, wenn man sich nicht regelmäßig mit so einem Thema beschäftigt.)

Und ja: Dein Code passt so. Ich kannte aber in erster Linie eine etwas andere Implementation, bei der mit zwei Zeigern von links und rechts heran gegangen wird.

Was ich noch anpassen würde - was aber kein Fehler ist denn der Code funktioniert auch so:

a) preparePartition benötigt den Parameter part nicht. Den kann man weg löschen und part zu einer lokalen Variable machen.

b) Beim preparePartition würde ich noch anpassen:

1.) part läuft bei links los und nicht bei links-1.
2.) die Schleife läuft bei links+1 los und nicht bei links. (links enthält ja das pivot element.)
3.) Tauschen bei < und nicht bei <= innerhalb der Schleife.

Die Punkte gleichen sich aus, denn du vergleichst das Element bei links mit dem pivot Element (Element bei links). Daher setzt Du part hoch (und das wird dann zu links und tauscht das Element mit sich selbst was nichts verändert und danach wird i hochgezählt.

Durch die Änderung sparst Du Dir aber paar Täusche (und du kommst näher an die Darstellung des Algorithmus auf Wikipedia.
 

Zrebna

Bekanntes Mitglied
Sorry für die späte Antwort. Du hast das natürlich richtig verstanden und ich habe mich in dem Punkt vertan. (Sowas passiert leider, wenn man sich nicht regelmäßig mit so einem Thema beschäftigt.)

Und ja: Dein Code passt so. Ich kannte aber in erster Linie eine etwas andere Implementation, bei der mit zwei Zeigern von links und rechts heran gegangen wird.

Was ich noch anpassen würde - was aber kein Fehler ist denn der Code funktioniert auch so:

a) preparePartition benötigt den Parameter part nicht. Den kann man weg löschen und part zu einer lokalen Variable machen.

b) Beim preparePartition würde ich noch anpassen:

1.) part läuft bei links los und nicht bei links-1.
2.) die Schleife läuft bei links+1 los und nicht bei links. (links enthält ja das pivot element.)
3.) Tauschen bei < und nicht bei <= innerhalb der Schleife.

Die Punkte gleichen sich aus, denn du vergleichst das Element bei links mit dem pivot Element (Element bei links). Daher setzt Du part hoch (und das wird dann zu links und tauscht das Element mit sich selbst was nichts verändert und danach wird i hochgezählt.

Durch die Änderung sparst Du Dir aber paar Täusche (und du kommst näher an die Darstellung des Algorithmus auf Wikipedia.

Hi!
Kein Ding und danke fürs Feedback!:)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Quicksort Rang ausgeben Allgemeine Java-Themen 2
M Quicksort Partition Allgemeine Java-Themen 0
Kirby.exe Quicksort Allgemeine Java-Themen 5
N Quicksort Programm hängt sich auf Allgemeine Java-Themen 6
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
D QuickSort (Pivotelement) Allgemeine Java-Themen 2
R Quicksort 3 Median funktioniert nur unzuverlässig Allgemeine Java-Themen 2
S Alphabetische sortierung mit Quicksort Allgemeine Java-Themen 10
S Quicksort Problem Allgemeine Java-Themen 4
S Frage zu dieser Quicksort Variante Allgemeine Java-Themen 2
G QuickSort Allgemeine Java-Themen 7
G ArrayList mit quicksort sortieren Allgemeine Java-Themen 9
D QuickSort, Interface Allgemeine Java-Themen 2
G QuickSort mit 2 Kriterien durchführen Allgemeine Java-Themen 12
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
schegga_B AES-Algorithmus in javax.crypto Allgemeine Java-Themen 3
M Laufzeit des Prim Algorithmus Allgemeine Java-Themen 3
O Newton Algorithmus Java Allgemeine Java-Themen 1
CptK Backpropagation Algorithmus Allgemeine Java-Themen 6
N Google Authenticator Algorithmus (SHA1) Allgemeine Java-Themen 1
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
B Algorithmus Warteschlange Ringpuffer wirklich fehlerfrei Allgemeine Java-Themen 8
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
F Q - Learning Algorithmus Bug Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
M Minmax Algorithmus Verständnisproblem Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
F KMP-Algorithmus Allgemeine Java-Themen 9
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
P MinMax Algorithmus Allgemeine Java-Themen 0
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
K Djikstra-Algorithmus Allgemeine Java-Themen 1
T Minimax/Alphabeta Algorithmus hängt sich auf (?) Allgemeine Java-Themen 2
M Algorithmus zum Zahlen einteilen Allgemeine Java-Themen 8
O Best Practice Hilfe bei Algorithmus gesucht Allgemeine Java-Themen 10
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
S Rucksackproblem und genetischer Algorithmus Allgemeine Java-Themen 9
L Abbruch des Algorithmus Allgemeine Java-Themen 8
D Input/Output Ausgleichen chemischer Reaktionsgleichungen mit dem Gauß-Algorithmus Allgemeine Java-Themen 2
Messoras A*-Algorithmus integrieren Allgemeine Java-Themen 3
S Buchscan 3D Dewarp Algorithmus - Ansätze Allgemeine Java-Themen 1
B Verteilungs-/Vergabe-Algorithmus mit abhängigen Score-Werten Allgemeine Java-Themen 3
Androbin "Shunting Yard"-Algorithmus Allgemeine Java-Themen 6
B Algorithmus - Project Euler Problem 18 Allgemeine Java-Themen 2
N Algorithmus zum bewerten von mathematischen Funktionen Allgemeine Java-Themen 11
O Algorithmus Optimierung Allgemeine Java-Themen 3
Joew0815 Algorithmus - Zahlenfolge in 4 ähnliche Teile aufteilen Allgemeine Java-Themen 0
O Tag Cloud Algorithmus Idee gesucht Allgemeine Java-Themen 2
A Implementierung eines Algorithmus (Farthest Insertion zur Lösung des TSP) in O(n²) Allgemeine Java-Themen 2
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
H Graph-Algorithmus gesucht Allgemeine Java-Themen 21
N Algorithmus durch Workflow Allgemeine Java-Themen 7
M tree-based diff Algorithmus (Code-Vergleiche) Allgemeine Java-Themen 3
S Uhrzeit Algorithmus sale Allgemeine Java-Themen 11
N A*-Algorithmus Allgemeine Java-Themen 5
A Suche Algorithmus zum Erstellen eines planaren Graphen Allgemeine Java-Themen 5
F Methoden Algorithmus zur Gegnerfindung (Turnier) Allgemeine Java-Themen 9
T Algorithmus Graph Allgemeine Java-Themen 10
J Algorithmus gesucht (Stringtransformation) Allgemeine Java-Themen 4
B Algorithmus Krankenhausbelegung Allgemeine Java-Themen 17
S Algorithmus von Dijkstra Allgemeine Java-Themen 2
alex_fairytail OOP Banknoten Algorithmus Teil 2 Allgemeine Java-Themen 13
2 ArrayList aktualisieren Algorithmus Allgemeine Java-Themen 11
alex_fairytail Methoden Banknoten Algorithmus Allgemeine Java-Themen 10
R Codehinweise: Algorithmus Größenvergleich von n Zahlen Allgemeine Java-Themen 5
SuperSeppel13 WTF?! Algorithmus-Geschwindigkeitstest Allgemeine Java-Themen 2
L Algorithmus für kürzesten Weg mit Wegpunkten Allgemeine Java-Themen 21
C Algorithmus Problem in Minesweeper Allgemeine Java-Themen 5
S Algorithmus um Labyrinth zu erzeugen Allgemeine Java-Themen 6
V Problem mit A* Pathfinder-Algorithmus Allgemeine Java-Themen 2
S Algorithmus um nächst folgende Primzahl zu berechnen Allgemeine Java-Themen 7
S Algorithmus Problem. Rechtecke effizient auf Spielfeld anordnen. Allgemeine Java-Themen 7
C Algorithmus-Hilfe Allgemeine Java-Themen 20
J Algorithmus Längenkombinationen? Allgemeine Java-Themen 7
M Kombinationen über rekursiven Algorithmus berechnen? Allgemeine Java-Themen 10
L Algorithmus für Poker-Hände Allgemeine Java-Themen 7
chik 2 return werte für Greedy-Algorithmus (gelöst) Allgemeine Java-Themen 3
D Abstruse Probleme mit eigenem replace Algorithmus Allgemeine Java-Themen 11
P RC4 Algorithmus Allgemeine Java-Themen 3
D RSA Verfahren - Erweiterter Euklidischer Algorithmus Allgemeine Java-Themen 4
C IBAN und Bic Validieren (Algorithmus) Allgemeine Java-Themen 10
P Problem mit A*-Algorithmus Allgemeine Java-Themen 12
M Wörter Algorithmus Allgemeine Java-Themen 7
M Algorithmus für automatische Zeilenumbrüche Allgemeine Java-Themen 12
K Postleitzahlen Algorithmus Allgemeine Java-Themen 12
G Problem mit Algorithmus Allgemeine Java-Themen 3
T Hilfe bei einem Algorithmus Allgemeine Java-Themen 2
S Stemming-Algorithmus gesucht (z.B. Porter) Allgemeine Java-Themen 2
RoliMG präfix zu infix algorithmus Allgemeine Java-Themen 6
Z A*-Algorithmus - Probleme mit offener/geschlossener Liste Allgemeine Java-Themen 7
S Javaimplementierung des MD5 Algorithmus Allgemeine Java-Themen 2
E Container-Pack-Algorithmus Allgemeine Java-Themen 4
G k nearest neighbor algorithmus Allgemeine Java-Themen 7
C HASH Algorithmus 2 Strings ergeben das Selbe. Allgemeine Java-Themen 2
P Page Rank Algorithmus implementieren Allgemeine Java-Themen 7
T Problem RSA-Algorithmus in Java? Allgemeine Java-Themen 2
minzel Hash-Algorithmus Allgemeine Java-Themen 9
Y komprimierung mittels Huffman-Algorithmus, bit-shifting. Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben