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

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:start [27.01.2022 15:02] – [Arrays mit zwei oder mehr Elementen] sbelfaecher:informatik:oberstufe:algorithmen:sortieren:quicksort:start [24.01.2024 16:34] (aktuell) – [Modellvorstellung] Marco Kuemmel
Zeile 5: Zeile 5:
 </WRAP> </WRAP>
  
-Quicksort ist ein sehr schnellet Sortieralgorithmus. Er kommt in der Praxis +Quicksort ist ein sehr schneller 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+häufig zum Einsatz. Zahlreiche Standardbibliotheken verschiedener Programmiersprachen enthalten Methodenum 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]]. ''qsort''. Quicksort verwendet ein [[..:..:teile_und_herrsche:start|Teile-und-herrsche-Prinzip]].
  
 ===== Modellvorstellung ===== ===== Modellvorstellung =====
  
-Stell dir vor die Schüler der 7a wollen sich wie die Orgelpfeifen der Größe nach geordnet aufstellen:+Stell dir vordie Schüler der 7a wollen sich wie die Orgelpfeifen der Größe nach geordnet aufstellen:
  
 {{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:unsortiert.drawio.png |}} {{ :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**.+Zunächst wählt man die erste Person als "Vergleichsgröße" aus, der Fachbegriff für das Element, das als Vergleichselement verwendet wirdist **Pivotelement**.
  
 {{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:pivot01.drawio_1_.png |}} {{ :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:+Jetzt teilt man das Problem in zwei Unterprobleme auf: Alle Schülerinnendie 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 |}} {{ :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.+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 stehen 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 |}} {{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:teilprobleme.drawio.png |}}
Zeile 34: Zeile 34:
 Dieses Vorgehen wird jetzt wiederholt bis der Basisfall eintritt. Dieses Vorgehen wird jetzt wiederholt bis der Basisfall eintritt.
  
-**Frage:** Was ist der Basisfall beim sortieren der Schülergruppen? Wann kannst du also direkt ohne weitere Überlegung eine sortierte Schülergruppe zurückgeben?+---- 
 +{{: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 ++++ Antwort: | Leere Arrays und Arrays mit nur einem Element stellen den Basisfall dar. Du
Zeile 41: Zeile 47:
 ===== Quicksort ===== ===== Quicksort =====
  
-==== Leere Arrays und solche mit nur einem Element ====+==== 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: 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:
Zeile 62: Zeile 68:
 {{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:qsortarray01.drawio.png |}} {{ :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 Verfahren 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 ====
 +
 +
 +Betrachten wir nun ein Array mit **4 Elementen**: 
 +
 +{{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:qsortarray02.drawio.png |}}
 +
 +Gleichgültig, welches Element man als Pivot Element wählt, erhält man eine Partitionierung, die aus eine linken Array, den Pivot-Element selbst und einem rechten Array besteht. in manchen Fällen sind die linken oder die rechten Arrays leer, was aber kein Problem darstellt, da das durch unseren Basisfall abgedeckt ist.
 +
 +{{ :faecher:informatik:oberstufe:algorithmen:sortieren:quicksort:qsortarray03.drawio.png |}}
 +
 +Das längste dabei auftretende "Unterarray" hat zwangsläufig die Länge drei, das das Pivotelement selbst bei der Partitionierung "herausgenommen" wird. **Ein Array der Länge drei können wir aber sortieren (s.o.)!**. Wenn wir unsere Quicksort Methode also rekursiv mit einem Array der Länge drei aufrufen, stellt das kein Problem dar.
 +
 +Diese Überlegung gilt nun analog für alle längeren Arrays: Nach der Partitionierung eines Arrays der Länge 5 hat das längste Unterarray die Länge 4. Wir wissen aber, dass wir ein Array der Länge 4 sortieren können (s.o.). Ein Array der Länge 6 hat nach der Partitionierung Unterarrays, die nicht länger als 5 sind, und so weiter.
 +
 +<WRAP center round tip 95%>
 +Es ist also möglich, Arrays mit beliebig vielen Elementen auf diese Weise sortieren. Dabei spielt es **keine Rolle, welches Element man als Pivotelement wählt**. Dieses Sortierverfahren heißt **Quicksort**.
 +</WRAP>
 +==== Quicksort: Pseudocode ====
 +
 +Damit sieht der  Quicksort-Algorithmus im Pseudocode folgendermaßen aus:
 +
 +<code>
 +quicksort(array): array
 +  wenn laenge(array) < 2:
 +    return array
 +  sonst:
 +    pivot = array[0]
 +    array kleiner  = (Alle Elemente von Array, die kleiner sind als pivot)
 +    array groesser = (Alle Elemente von Array, die größer sind als pivot)
 +    return quicksort(kleiner) + pivot + quicksort(groesser)
 +</code>
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A3) ===
 +
 +Identifiziere im Pseudocode den ''Basisfall'', den ''Rekursionsfall'' und die ''Partitionierung''.
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A4) ===
 +
 +Verwende die Vorlage https://codeberg.org/qg-info-unterricht/array-summe. Implementiere dort die Methode ''quicksort'' in Java. 
 +
 +  * Implementiere eine Methode ''kontrollausgabe(array)'', die es dir ermöglicht das Array vor und nach dem Sortieren zu betrachten
 +  * Teste deine Methode mit unterschiedlichen Arrays - mit verschiedenen Wertebereichen und Längen. Kontrolliere die Ausgaben.
  
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A5) ===
 +Implementiere eine Methode quicksort, im Musiklisten-Projekt (https://codeberg.org/qg-info-unterricht/musikliste-sortieren) um die Musikliste nach den Ratings zu sortieren. 
  • faecher/informatik/oberstufe/algorithmen/sortieren/quicksort/start.txt
  • Zuletzt geändert: 24.01.2024 16:34
  • von Marco Kuemmel