faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Nächste Überarbeitung
Vorherige Überarbeitung
Nächste ÜberarbeitungBeide Seiten, nächste Überarbeitung
faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:start [26.01.2022 22:28] – angelegt sbelfaecher:informatik:oberstufe:algorithmen:sortieren:quicksort:start [31.01.2022 16:20] – [Arrays mit mehr Elementen] sbel
Zeile 1: Zeile 1:
 ====== Quicksort ====== ====== Quicksort ======
  
-Um den Quicksort Algorithmus verstehen und implementieren zu können, sollte man die Abschnitte [[..:rekursion:start|Rekursion]] und das [[..:teile_und_herrsche:start|Teile-und-Herrsche-Prinzip]] bearbeitet haben.+<WRAP center round info 95%> 
 +Um den Quicksort Algorithmus verstehen und implementieren zu können, sollte man die Abschnitte [[..:..:rekursion:start|Rekursion]] und das [[..:..:teile_und_herrsche:start|Teile-und-Herrsche-Prinzip]] bearbeitet haben. 
 +</WRAP> 
 + 
 +Quicksort ist ein sehr schnellet Sortieralgorithmus. Er kommt in der Praxis 
 +häufig zum Einsatz. Zahlreiche Standardbibliotheken verschiedener Programmiersprachen enthalten Methoden um zum Beispiel Arrays zu sortieren, die in als Quicksort implementiert sind. Zum Beispiel hat die  Standardbibliothek der Programmiersprache C eine Funktion namens 
 +''qsort''. Quicksort verwendet ein [[..:..:teile_und_herrsche:start|Teile-und-herrsche-Prinzip]]. 
 + 
 +===== Modellvorstellung ===== 
 + 
 +Stell dir vor die Schüler der 7a wollen sich wie die Orgelpfeifen der Größe nach geordnet aufstellen: 
 + 
 +{{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:unsortiert.drawio.png |}} 
 + 
 +Zunächst wählt man die erste Person als "Vergleichsgröße" aus, der Fachbegriff für das Element, das als Vergleichselement verwendet wird ist **Pivotelement**. 
 + 
 +{{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:pivot01.drawio_1_.png |}} 
 + 
 +Jetzt teilt man das Problem in zwei Unterprobleme auf: Alle Schülerinnen die kleiner als das Pivotelement sind stellen sich links davon auf, alle die größer oder gleich sind rechts: 
 + 
 +{{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:split01.drawio.png |}} 
 + 
 +Das Pivotelement scheidet jetzt aus dem Verfahren aus, es bleibt an dem Platz, an dem es sich jetzt befindet. Jetzt haben wir zwei "kleinere" Sortierprobleme geschaffen: Die Schülerinnen, die links setehen sind ungeordnet, die größeren auf der rechten Seite ebenfalls. Auf jeden Fall -- auch im ungünstigsten((welches ist der ungünstigste Fall?)) -- sind die neuen Teilproblem(e) kleiner als das ursprüngliche Problem. 
 + 
 +{{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:teilprobleme.drawio.png |}} 
 + 
 +In den beiden Teilmengen verfährt man jetzt wie gerade in der Ausgangsmenge:  
 + 
 +  * Pivotelement wählen (die erste Schülerin ganz links) 
 +  * Menge in zwei Teile teilen: Kleiner und größer/gleich Pivotelement 
 + 
 +Dieses Vorgehen wird jetzt wiederholt bis der Basisfall eintritt. 
 + 
 +---- 
 +{{:aufgabe.png?nolink  |}} 
 +=== (A1) === 
 + 
 +Führe das Verfahren mit Stift und Papier zu Ende, bis du die Schüler nach Körpergröße sortiert hast. 
 + 
 +**Frage:** Was ist der Basisfall beim sortieren der Schülergruppen? Wann kannst du also direkt ohne weitere Überlegung eine sortierte Schülergruppe zurückgeben? 
 + 
 +++++ Antwort: | Leere Arrays und Arrays mit nur einem Element stellen den Basisfall dar. Du 
 +kannst solche Arrays unverändert zurückgeben – es gibt nichts zu sortieren ++++ 
 + 
 +===== Quicksort ===== 
 + 
 +==== Leere Arrays, Arrays mit einem oder zwei Element ==== 
 + 
 +Wir legen den Basisfall zugrunde: Wenn unser Array leer ist oder nur ein Element hat, ist es sortiert und kann direkt als sortiertes Array zurückgegeben werden: 
 + 
 +<code java> 
 +public ArrayList<Integer> quicksort(ArrayList<Integer> listToSort) { 
 +   if(listToSort.size() < 2) { 
 +     return listToSort; 
 +   } 
 +   [...] 
 +
 +</code> 
 + 
 +==== Arrays mit zwei oder mehr Elementen ==== 
 + 
 +Arrays mit **zwei Elementen** sind ebenfalls einfach zu bearbeiten: Man muss lediglich die beiden Elemente vergleichen und wenn nötig vertauschen, bevor man das dann sortierte Array zurückgibt. 
 + 
 +Spannend wird es, wenn das Array drei Elemente hat: 
 + 
 +{{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:qsortarray01.drawio.png |}} 
 + 
 +Wir gehen vor, wie oben angedacht:  
 +  * Pivotelement wählen (erstes Element des Arrays) 
 +  * Partitionieren in //Elemente kleiner als Privot//, //Pivot// und //Elemente größer/gleich Pivot//: 
 + 
 +{{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:partition01.drawio.png |}} 
 + 
 +Bislang haben wir als Pivotelemet stets einfach das erste Element des Arrays gewählt - tatsächlich ist es zunächst unerheblich, welches der Elemente man dazu heranzieht. 
 + 
 +---- 
 +{{:aufgabe.png?nolink  |}} 
 +=== (A2) === 
 +Untersuche, ob die Auswahl des Pivotelements einen Einfluss auf das Ergebnis des Sortiervorgangs hat, indem du das Verafhren mit jedem der Elemente als Pivotelement durchführst. 
 + 
 +Das sortierte Array erhält man anschließend zuverlässig als: 
 + 
 +{{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:sorted.drawio.png |}} 
 + 
 + 
 +<WRAP center round tip 95%> 
 +Wir können also Arrays mit (bis zu) 3 Elementen auf diese Weise sortieren. Dabei spielt es **keine Rolle, welches Element man als Pivotelement wählt**. 
 +</WRAP> 
 + 
 +==== Arrays mit mehr Elementen ==== 
 + 
 + 
  • faecher/informatik/oberstufe/algorithmen/sortieren/quicksort/start.txt
  • Zuletzt geändert: 24.01.2024 16:34
  • von Marco Kuemmel