Vorlesung 11 | Fortgeschrittene Algorithmen
Ordnung ins Chaos bringen
Ziel: Elemente so umordnen, dass arr[0] ⤠arr[1] ⤠... ⤠arr[n-1]
Analogie: Wie wenn Sie Spielkarten sortieren, indem Sie immer die kleinste Karte suchen und nach vorne legen.
Finde Minimum (11), tausche mit 64
Finde Minimum (12), tausche mit 25
Finde Minimum (22), tausche mit 25
Durchgang 1: n-1 Vergleiche
Durchgang 2: n-2 Vergleiche
...
Durchgang n-1: 1 Vergleich
Gesamt:
(n-1) + (n-2) + ... + 1
= n(n-1)/2
â n²/2
Vorteil: Minimale Anzahl an Tauschen (gut wenn Schreiben teuer ist)
Ein Sortieralgorithmus ist In-place, wenn er keinen zusätzlichen Speicher benĂśtigt (auĂer ein paar Variablen). Das Array wird direkt vor Ort sortiert.
Speicherverbrauch:
O(1) - konstant!
Egal ob n=10 oder n=1.000.000, wir brauchen nur 2-3 Extra-Variablen
Speicherverbrauch:
O(n) - linear!
Bei n=1.000.000 Elementen brauchen wir ein zweites Array mit 1.000.000 Plätzen!
Ein Sortieralgorithmus ist stabil, wenn gleiche Elemente nach dem Sortieren ihre ursprĂźngliche relative Reihenfolge beibehalten.
â Die Reihenfolge der beiden 5er bleibt erhalten:
5a kommt vor 5b (wie im Original)
â Die Reihenfolge wurde vertauscht:
Jetzt kommt 5b vor 5a!
Wenn Sie nach mehreren Kriterien sortieren wollen (z.B. erst nach Name, dann nach Alter), brauchen Sie einen stabilen Algorithmus! Sonst geht die erste Sortierung verloren.
Grund: Beim Tauschen Ăźber groĂe Distanzen kĂśnnen gleiche Elemente ihre relative Position verlieren!
| Runde i | Vergleiche |
|---|---|
| 0 | 4 (n-1) |
| 1 | 3 (n-2) |
| 2 | 2 (n-3) |
| 3 | 1 (n-4) |
| Summe | 10 |
Wichtig: Die Komplexität ist O(n²), weil der Term n² fĂźr groĂe n am stärksten wächst!
Analogie: Wie Karten sortieren beim Kartenspiel - neue Karte an richtige Stelle in der Hand einfĂźgen.
Wichtig: Das erste Element (64) gilt als bereits sortiert.
GrĂźn = sortierter Bereich | WeiĂ = unsortierter Bereich
Was passiert?
key = 25 (das aktuelle Element)Ergebnis: Jetzt sind die ersten 2 Elemente sortiert!
Was passiert?
key = 12key = 22Was passiert?
key = 11â Fertig! Das Array ist vollständig sortiert.
Worst Case: Array ist umgekehrt sortiert
â O(n²) Vergleiche und Verschiebungen
Best Case: Array ist bereits sortiert
â O(n) - nur n-1 Vergleiche!
Average Case: O(n²)
Ideal fĂźr: Kleine Arrays oder fast sortierte Daten
Ein Sortieralgorithmus ist stabil, wenn Elemente mit gleichem SchlĂźssel ihre relative Reihenfolge behalten.
Eingabe: (Anna, 25), (Bob, 30), (Clara, 25)
Stabil:
(Anna, 25), (Clara, 25), (Bob, 30)
Anna bleibt vor Clara!
Nicht stabil:
(Clara, 25), (Anna, 25), (Bob, 30)
Reihenfolge von Anna/Clara geändert!
| Eigenschaft | Selection Sort | Insertion Sort |
|---|---|---|
| Best Case | O(n²) | O(n) |
| Worst Case | O(n²) | O(n²) |
| Tausche/Verschiebungen | O(n) | O(n²) |
| Stabil | Nein | Ja |
| Adaptiv | Nein | Ja |
Eigenschaften: O(n²), stabil, in-place
Kann optimiert werden mit "swapped"-Flag fĂźr O(n) Best Case
Idee: Tausche benachbarte Elemente
Gut fßr: Pädagogik, kleine Arrays
Nachteil: Viele Tausche
Idee: Finde Minimum, setze ans Ende
Gut fĂźr: Wenn Schreiben teuer
Nachteil: Immer O(n²)
Idee: FĂźge an richtiger Stelle ein
Gut fĂźr: Fast sortierte Daten
Nachteil: O(n²) worst case
In der Praxis: Insertion Sort ist meist der beste der drei!
â Insertion Sort - einfach, geringe Konstante
â Insertion Sort - O(n) im Best Case!
â Selection Sort - nur n-1 Tausche
â Insertion Sort oder Bubble Sort
â Effizientere Algorithmen wie Quicksort oder Mergesort (O(n log n))
Einfach: Nur den Vergleichsoperator umdrehen!
A) Bubble Sort
B) Selection Sort
C) Insertion Sort
Erkennungsmerkmale:
key = arr[i] - speichert Element zum EinfĂźgenarr[j+1] = key - fĂźgt an richtiger Stelle einZum Vergleich:
Selection Sort hat minIdx und sucht das Minimum
Bubble Sort vergleicht arr[j] mit arr[j+1]
Vergleiche benachbarte Elemente und tausche sie, wenn sie in falscher Reihenfolge sind. Wiederhole das, bis keine Tauschvorgänge mehr nÜtig sind.
đĄ Optimierung: Das swapped-Flag erlaubt frĂźhzeitiges Abbrechen,
wenn das Array bereits sortiert ist!
Problem: Ohne Optimierung läuft Bubble Sort immer n-1 Durchgänge, auch wenn das Array bereits sortiert ist!
Bei sortiertem Array [1,2,3,4,5]:
⢠Durchgang 1: 4 Vergleiche, 0 Tausche
⢠Durchgang 2: 3 Vergleiche, 0 Tausche
⢠Durchgang 3: 2 Vergleiche, 0 Tausche
⢠Durchgang 4: 1 Vergleich, 0 Tausche
Gesamt: 10 Vergleiche = O(n²) đ˘
Bei sortiertem Array [1,2,3,4,5]:
⢠Durchgang 1: 4 Vergleiche, 0 Tausche
⢠swapped == 0 â BREAK!
Gesamt: 4 Vergleiche = O(n) đ
đĄ Fazit: Das swapped-Flag macht Bubble Sort adaptiv - es passt sich an bereits sortierte Daten an. Ohne Flag ist Bubble Sort immer O(n²), egal wie gut die Eingabe ist!
Ein Sortieralgorithmus ist stabil, wenn gleiche Elemente ihre relative Reihenfolge behalten.
Die beiden 3er behalten ihre Reihenfolge: A vor C
Die beiden 3er haben Reihenfolge getauscht: C vor A
Studenten nach Note sortieren - bei gleicher Note soll die alphabetische Reihenfolge erhalten bleiben:
Anna: 2.3 Bernd: 1.7 Clara: 2.3 Daniel: 1.0 Emma: 2.3
Daniel: 1.0 Bernd: 1.7 Anna: 2.3 â Reihenfolge Clara: 2.3 â bleibt Emma: 2.3 â erhalten!
đĄ Wichtig: Wenn Sie nach mehreren Kriterien sortieren wollen (z.B. erst nach Name, dann nach Note), brauchen Sie einen stabilen Algorithmus!
| Array-GrĂśĂe | Selection Sort | Insertion Sort | Bubble Sort |
|---|---|---|---|
| 100 Elemente | ~0.1 ms | ~0.05 ms | ~0.15 ms |
| 1,000 Elemente | ~10 ms | ~5 ms | ~15 ms |
| 10,000 Elemente | ~1 Sekunde | ~0.5 Sekunden | ~1.5 Sekunden |
| 100,000 Elemente | ~100 Sekunden | ~50 Sekunden | ~150 Sekunden |
â ď¸ Merke: Bei groĂen Datenmengen sind O(n²)-Algorithmen zu langsam! Effizientere Algorithmen (O(n log n)) sortieren 100,000 Elemente in ~0.01 Sekunden!
Letztes Element wird unnĂśtig "sortiert"
Macht stabilen Algorithmus instabil!
Daten gehen verloren!
Array-Index out of bounds!
Nächste Vorlesung: Binäre Suche & Komplexität