Inhaltsverzeichnis

Sortieren

Ideen 2024

Damit wir die effiziente Binärsuche verwenden können, muss der Suchbereich sortiert sein. Aber wie sortieren wir eine Liste? Wie lange dauert es?

Aufgabe C1: Manuell Sortieren

Sortiere eine Anzahl Elemente und dokumentiere den gefundenen Algorithmus so, dass eine andere Gruppe ihn nachvollziehen kann.

Spielkarten

Sortiere 8 Spielkarten oder Zahlenkarten [60, 32, 16, 35, 77, 29, 22, 80] (Online-Alternative).

Kugeln

Du hast 8 Plastikkugeln, die sich nur im Gewicht unterscheiden, und eine Tafelwaage. Das Ziel ist, die Kugeln nach Gewicht zu sortieren.

Sortieralgorithmen

Sortieren ist eines der Grundprobleme der Informatik, und es existieren dutzende von Algorithmen mit unterschiedlichen Eigenschaften. Die wichtigsten Eigenschaften sind die folgenden:

Aufgabe C2: Sortierung Prüfen

Schreibe eine Funktion is_sorted(l) die genau dann True zurückgibt, wenn l aufsteigend sortiert ist, sonst False.

Wieviele Vergleiche sind nötig, um eine Liste der Länge $n$ zu testen?

Hinweise

Lösung

Aufgabe C3: Selection Sort

Das Ziel von Selection Sort ist, zuerst die kleinste Zahl in der Liste zu finden und diese an der ersten Stelle der sortierten Liste zu platzieren. Danach machen wir weiter mit der zweitkleinsten Zahl usw.

Teil 1: Manuell

Arbeite wieder mit den Zahlen-Kärtchen: Lege diese in zufälliger Reihenfolge auf den Tisch. Wende dann den Selectionsort-Algorithmus an, um diese zu sortieren.

Kannst du SelectionSort als in-place Algorithmus anwenden?

Teil 2: Python

Hier ist der Lösungsweg für Selection Sort Schritt für Schritt zusammengestellt.

Hier dasselbe für In-place Selection Sort.

Aufgabe C4: Selection Sort anwenden

Du hast folgende beiden Listen:

obstsorten = ["Kirsche", "Apfel", "Banane", "Orange", "Mango", "Pfirsich", "Erdbeere", "Birne", "Himbeere", "Kiwi", "Ananas", "Blaubeere"]
farben = ["gelb", "rot", "gelb", "grün", "blau", "rot", "rot", "rot", "braun", "orange", "orange", "orange"]

Das Problem: Die Liste obsorten ist nicht sortiert. Wäre sie sortiert, so würden die beiden Listen korrespondieren (der erste Eintrag von obsorten entspräche dem ersten Eintrag von farben etc.)

Lösung

C5 (Zusatzaufgabe): Insertion Sort

Der Algorithmus wird hier vorgestellt und Schritt für Schritt implementiert.

C6 (Herausforderung): Laufzeit-Analyse

Selection Sort ist in-place (es wird kein zusätzlicher Platz benötigt).

Aber wie berechnen wir die Laufzeit des Algorithmus? Wieviele Vergleiche führen wir bei SelectionSort aus, um n Elemente zu sortieren?

Es wird jedes Element mit jedem anderen verglichen. Intuitiv scheint es möglich, mit weniger Vergleichen auszukommen. Wenn wir wissen, dass x > y und y > z ist, so müssten wir eigentlich x nicht mehr mit z vergleichen. Aber wieviele Vergleiche sind mindestens notwendig? Können wir einen Divide & Conquer Ansatz wie bei der Binärsuche verwenden?

C7 (Herausforderung): Quicksort

Von der Binärsuche wissen wir, dass wir eine Liste in $log_2(n)$ Halbierungen auf einzelne Elemente reduzieren können. Hätten wir nun eine Möglichkeit, beim Halbieren auch noch sicherzustellen, dass die beiden Hälften entmischt sind (also, dass alle Elemente in der ersten Hälfte kleiner sind als die Elemente in der zweiten Hälfte), so hätten wir schon fast gewonnen.

Hm, ist $n\cdot{}log(n)$ viel besser als $\frac{n^2}{2}$? Stackoverflow hat die Antwort.

Das obige Rezept beschreibt den Quicksort Algorithmus. Getraust du dich an eine Implementierung in Python?

Hinweise

Lösung