Skip to content

⚙ Thema 6: Algorithmen ​

Überblick ​

In diesem Themenbereich geht es darum, wie Probleme mit klaren Schrittfolgen gelöst werden können. Solche Schrittfolgen nennt man Algorithmen.

Algorithmen begegnen uns nicht nur beim Programmieren, sondern auch im Alltag:

  • beim Suchen eines Namens in einer Liste,
  • beim Sortieren von Karten,
  • beim Navigieren mit einer Karten-App,
  • beim Filtern von Suchergebnissen,
  • beim Empfehlen von Videos oder Musik,
  • beim Planen von Routen,
  • beim automatischen Auswerten von Daten.

In der Informatik interessiert nicht nur, ob ein Algorithmus funktioniert. Wichtig ist auch, wie effizient er arbeitet und wie sich sein Verhalten bei kleinen oder großen Datenmengen verĂ€ndert.

Leitfrage

Wie lassen sich Probleme durch klare Schrittfolgen lösen, und woran erkennt man, ob ein Algorithmus effizient arbeitet?

Was ist ein Algorithmus? ​

Ein Algorithmus ist eine eindeutige Schrittfolge zur Lösung eines Problems.

Ein Algorithmus beschreibt also nicht nur ungefĂ€hr, was passieren soll, sondern legt fest, welche Schritte in welcher Reihenfolge ausgefĂŒhrt werden.

Beispiel aus dem Alltag:

Suche ein bestimmtes Wort in einem Wörterbuch.

Mögliche Strategie:

  1. Öffne das Wörterbuch ungefĂ€hr in der Mitte.
  2. Vergleiche das gesuchte Wort mit den Wörtern auf der Seite.
  3. Entscheide, ob du links oder rechts weitersuchen musst.
  4. Wiederhole das Vorgehen, bis du das Wort gefunden hast oder sicher bist, dass es nicht vorkommt.

Merke

Ein Algorithmus ist eine prĂ€zise Vorschrift, die Schritt fĂŒr Schritt zu einer Lösung fĂŒhren soll.

Eigenschaften von Algorithmen ​

Algorithmen besitzen typische Eigenschaften.

EigenschaftBedeutung
EindeutigkeitJeder Schritt ist klar beschrieben.
AusfĂŒhrbarkeitJeder Schritt kann tatsĂ€chlich durchgefĂŒhrt werden.
EndlichkeitDer Algorithmus endet nach endlich vielen Schritten.
KorrektheitDer Algorithmus liefert fĂŒr gĂŒltige Eingaben das richtige Ergebnis.
AllgemeinheitDer Algorithmus funktioniert nicht nur fĂŒr einen Einzelfall, sondern fĂŒr eine Klasse Ă€hnlicher Probleme.
EffizienzDer Algorithmus löst das Problem mit möglichst angemessenem Aufwand.

Wichtig

Ein Algorithmus kann korrekt sein, aber trotzdem unpraktisch langsam. Deshalb ist Effizienz ein wichtiger Bestandteil der Bewertung.

Determinismus und Determiniertheit ​

Zwei Begriffe klingen Àhnlich, bedeuten aber nicht genau dasselbe.

BegriffBedeutung
DeterminismusBei jedem Schritt ist eindeutig festgelegt, welcher nÀchste Schritt folgt.
DeterminiertheitBei gleicher Eingabe entsteht immer dieselbe Ausgabe.

Ein deterministischer Algorithmus ist Schritt fĂŒr Schritt eindeutig festgelegt.

Ein determinierter Algorithmus liefert bei gleicher Eingabe immer dasselbe Ergebnis.

Merke

Determinismus beschreibt den Ablauf.
Determiniertheit beschreibt das Ergebnis.

Ein Beispiel fĂŒr einen nicht vollstĂ€ndig vorhersehbaren Ablauf wĂ€re ein Programm, das Zufallszahlen verwendet. Es kann trotzdem nach festen Regeln programmiert sein, aber die konkrete Ausgabe kann sich unterscheiden.

Effizienz ​

Effizienz beschreibt, wie viele Ressourcen ein Algorithmus benötigt.

Wichtige Ressourcen sind:

  • Zeit,
  • Speicherplatz,
  • Energie,
  • Anzahl der Vergleiche,
  • Anzahl der Rechenschritte,
  • Anzahl der Zugriffe auf Daten.

In der Schule betrachten wir meistens die Laufzeit bzw. die Anzahl der notwendigen Schritte.

Merksatz

Ein effizienter Algorithmus löst ein Problem nicht nur richtig, sondern auch mit möglichst geringem Aufwand.

Laufzeitverhalten ​

Das Laufzeitverhalten beschreibt, wie sich der Aufwand eines Algorithmus verĂ€ndert, wenn die Eingabe grĂ¶ĂŸer wird.

Dabei fragt man zum Beispiel:

  • Was passiert bei 10 Elementen?
  • Was passiert bei 1 000 Elementen?
  • Was passiert bei 1 000 000 Elementen?

Ein Algorithmus, der bei kleinen Datenmengen schnell genug ist, kann bei großen Datenmengen plötzlich ungeeignet werden.

Best Case, Worst Case und Average Case ​

Das Laufzeitverhalten hĂ€ngt oft davon ab, wie gĂŒnstig oder ungĂŒnstig die Eingabe ist.

FallBedeutung
Best CasegĂŒnstigster Fall
Worst CaseungĂŒnstigster Fall
Average Casedurchschnittlich erwarteter Fall

Beispiel: Suche in einer Liste

  • Best Case: Das gesuchte Element steht ganz vorne.
  • Worst Case: Das gesuchte Element steht ganz hinten oder kommt gar nicht vor.
  • Average Case: Das gesuchte Element liegt irgendwo in der Liste.

Merke

Bei der Bewertung von Algorithmen sollte man nicht nur den gĂŒnstigsten Fall betrachten. Besonders wichtig ist oft der Worst Case, weil er zeigt, wie schlecht es höchstens laufen kann.

Lineare Suche ​

Die lineare Suche prĂŒft eine Liste Element fĂŒr Element.

Beispiel:

txt
[4, 9, 12, 18, 23, 31]

Gesucht wird 18.

Ablauf:

  1. PrĂŒfe 4 → nicht gesucht.
  2. PrĂŒfe 9 → nicht gesucht.
  3. PrĂŒfe 12 → nicht gesucht.
  4. PrĂŒfe 18 → gefunden.

Die lineare Suche funktioniert auch dann, wenn die Liste nicht sortiert ist.

Merke

Lineare Suche ist einfach und zuverlĂ€ssig, benötigt aber im ungĂŒnstigsten Fall viele Vergleiche.

Lineare Suche in Python ​

python
def enthaelt_wert(liste, suchwert):
    for element in liste:
        if element == suchwert:
            return True

    return False


zahlen = [4, 9, 12, 18, 23, 31]

print(enthaelt_wert(zahlen, 18))
print(enthaelt_wert(zahlen, 7))

Die Funktion durchlĂ€uft die Liste von links nach rechts. Sobald der gesuchte Wert gefunden wurde, gibt sie True zurĂŒck. Wird der Wert nicht gefunden, gibt sie am Ende False zurĂŒck.

Laufzeit der linearen Suche ​

Bei n Elementen gilt:

FallAufwand
Best Case1 Vergleich
Worst Casen Vergleiche
Average CaseungefÀhr n/2 Vergleiche

Wichtig

Die lineare Suche braucht keine sortierte Liste. Das ist ein Vorteil. Bei großen Listen kann sie aber langsam werden.

📝 Übung: Lineare Suche nachvollziehen ​

Gegeben ist die Liste:

txt
[6, 11, 15, 22, 27, 34, 40]

Gesucht wird 27.

  1. Notiere, welche Elemente der Reihe nach geprĂŒft werden.
  2. Gib an, nach wie vielen Vergleichen der Wert gefunden wird.
  3. ErklĂ€re, was passieren wĂŒrde, wenn 99 gesucht wird.
Lösung

GeprĂŒft werden:

txt
6, 11, 15, 22, 27

Der Wert wird nach 5 Vergleichen gefunden.

Wenn 99 gesucht wird, muss die ganze Liste durchsucht werden. Danach kann man feststellen, dass der Wert nicht vorkommt.

BinĂ€re Suche ​

Die binÀre Suche ist deutlich effizienter als die lineare Suche, hat aber eine wichtige Voraussetzung:

Voraussetzung

BinÀre Suche funktioniert nur korrekt, wenn die Liste sortiert ist.

Die Grundidee:

  1. Betrachte das mittlere Element der Liste.
  2. Vergleiche den Suchwert mit diesem Element.
  3. Ist der Suchwert gleich, wurde er gefunden.
  4. Ist der Suchwert kleiner, suche nur links weiter.
  5. Ist der Suchwert grĂ¶ĂŸer, suche nur rechts weiter.
  6. Wiederhole das Vorgehen.

Beispiel:

txt
[2, 5, 8, 12, 16, 23, 38, 45, 56]

Gesucht wird 45.

Ablauf:

  1. Mitte: 16
    45 ist grĂ¶ĂŸer → rechts weitersuchen.

  2. Neuer Bereich:

txt
[23, 38, 45, 56]

Mitte ungefÀhr: 38
45 ist grĂ¶ĂŸer → rechts weitersuchen.

  1. Neuer Bereich:
txt
[45, 56]

Mitte: 45
gefunden.

Merke

Bei jedem Schritt wird ungefÀhr die HÀlfte der verbleibenden Liste ausgeschlossen.

Visualisierung der binÀren Suche mit schrittweiser Halbierung des Suchbereichs.
Abb.: BinÀre Suche: Der Suchbereich wird schrittweise halbiert. Bei 1 000 000 000 Elementen sind maximal 30 Vergleiche nötig. Eigene Darstellung.

BinĂ€re Suche in Python ​

python
def binaere_suche(sortierte_liste, suchwert):
    links = 0
    rechts = len(sortierte_liste) - 1

    while links <= rechts:
        mitte = (links + rechts) // 2
        aktueller_wert = sortierte_liste[mitte]

        if aktueller_wert == suchwert:
            return True
        elif suchwert < aktueller_wert:
            rechts = mitte - 1
        else:
            links = mitte + 1

    return False


werte = [2, 5, 8, 12, 16, 23, 38, 45, 56]

print(binaere_suche(werte, 45))
print(binaere_suche(werte, 7))

Merksatz

BinĂ€re Suche ist besonders stark bei großen, sortierten Datenmengen.

Lineare und binĂ€re Suche vergleichen ​

MerkmalLineare SucheBinÀre Suche
Voraussetzungkeine Sortierung nötigListe muss sortiert sein
VorgehenElement fĂŒr Element prĂŒfenSuchbereich halbieren
Vorteileinfach, funktioniert immersehr effizient bei großen Listen
Nachteillangsam bei großen ListenSortierung muss vorhanden sein
Worst Casen VergleicheungefĂ€hr log₂(n) Vergleiche

Beispielhafte GrĂ¶ĂŸenordnung:

Anzahl ElementeLineare Suche im Worst CaseBinÀre Suche ungefÀhr
1010 Vergleiche4 Vergleiche
100100 Vergleiche7 Vergleiche
1 0001 000 Vergleiche10 Vergleiche
1 000 0001 000 000 Vergleiche20 Vergleiche

Merke

Der Unterschied zwischen linearer und binĂ€rer Suche wird bei großen Datenmengen besonders deutlich.

Lohnt sich Sortieren vor dem Suchen? ​

Ob sich Sortieren vor dem Suchen lohnt, hÀngt vom Anwendungsfall ab.

Wenn du nur einmal in einer kleinen unsortierten Liste suchst, ist Sortieren oft unnötiger Zusatzaufwand.

Wenn du aber sehr oft in derselben Liste suchst, kann es sinnvoll sein, die Liste zuerst zu sortieren und danach binÀr zu suchen.

Denkfrage

Sortieren kostet zuerst Aufwand. Dieser Aufwand kann sich lohnen, wenn danach viele SuchvorgÀnge schneller werden.

Beispiel:

Eine unsortierte Liste enthÀlt 20 Werte. Du suchst nur einmal.

  • Lineare Suche ist einfach und wahrscheinlich ausreichend.
  • Sortieren wĂ€re zusĂ€tzlicher Aufwand.

Eine Liste enthĂ€lt 100 000 Werte. Du musst tĂ€glich viele Suchanfragen durchfĂŒhren.

  • Einmaliges Sortieren kann sinnvoll sein.
  • Danach kann jede Suche mit binĂ€rer Suche deutlich schneller erfolgen.

Wichtig

Effizienz hĂ€ngt vom Kontext ab. Ein Algorithmus ist nicht immer „besser“, sondern nur fĂŒr bestimmte Bedingungen besser geeignet.

Sortieren ​

Ein Sortieralgorithmus bringt Elemente in eine bestimmte Reihenfolge.

Beispiele:

  • Zahlen aufsteigend sortieren,
  • Namen alphabetisch sortieren,
  • Dateien nach Datum sortieren,
  • Produkte nach Preis sortieren,
  • Nachrichten nach Uhrzeit sortieren.

Sortieren ist in der Informatik sehr wichtig, weil viele andere Verfahren dadurch schneller oder einfacher werden.

Merke

Sortieren braucht ein Sortierkriterium. Ohne erkennbares Kriterium sind Daten zwar vielleicht irgendwie angeordnet, aber informatisch nicht sinnvoll sortiert.

Selection Sort ​

Selection Sort bedeutet „Sortieren durch AuswĂ€hlen“.

Die Grundidee:

  1. Suche im unsortierten Bereich das kleinste Element.
  2. Tausche es mit dem ersten Element des unsortierten Bereichs.
  3. Der sortierte Bereich wÀchst um ein Element.
  4. Wiederhole das Vorgehen, bis die Liste sortiert ist.

Beispiel:

txt
[6, 2, 9, 4]

Erster Durchlauf:

  • kleinstes Element suchen: 2
  • 2 mit dem ersten Element 6 tauschen
  • Ergebnis:
txt
[2, 6, 9, 4]

Zweiter Durchlauf:

  • unsortierter Bereich: [6, 9, 4]
  • kleinstes Element: 4
  • 4 mit 6 tauschen
  • Ergebnis:
txt
[2, 4, 9, 6]

Dritter Durchlauf:

  • unsortierter Bereich: [9, 6]
  • kleinstes Element: 6
  • 6 mit 9 tauschen
  • Ergebnis:
txt
[2, 4, 6, 9]

Merke

Bei Selection Sort wird in jedem Durchlauf das kleinste Element des unsortierten Bereichs ausgewÀhlt und an die nÀchste richtige Position gebracht.

Visualisierung von Selection Sort: Das kleinste Element des unsortierten Bereichs wird gesucht und nach vorne getauscht.
Abb.: Selection Sort: Das kleinste Element der unsortierten Folge wird gesucht und mit dem ersten Element der unsortierten Folge getauscht. Eigene Darstellung.

Vertiefung: Insertion Sort ​

Insertion Sort bedeutet „Sortieren durch EinfĂŒgen“.

Die Grundidee Àhnelt dem Sortieren von Spielkarten auf der Hand:

  1. Ein Teil der Liste gilt bereits als sortiert.
  2. Das nÀchste Element aus dem unsortierten Bereich wird genommen.
  3. Dieses Element wird an der passenden Stelle in den sortierten Bereich eingefĂŒgt.
  4. Der sortierte Bereich wĂ€chst Schritt fĂŒr Schritt.

Beispiel:

txt
[5, 2, 8, 1]

Man betrachtet zunÀchst 5 als sortierten Bereich.

Dann wird 2 passend eingefĂŒgt:

txt
[2, 5, 8, 1]

Dann wird 8 eingefĂŒgt. Es bleibt hinter 5:

txt
[2, 5, 8, 1]

Dann wird 1 ganz vorne eingefĂŒgt:

txt
[1, 2, 5, 8]

Merke

Bei Insertion Sort wird jedes neue Element in einen bereits sortierten Bereich passend eingefĂŒgt.

Visualisierung von Insertion Sort: Elemente werden passend in die sortierte Folge eingefĂŒgt.
Abb.: Insertion Sort: Das erste Element der unsortierten Folge wird gewĂ€hlt und passend in die sortierte Folge eingefĂŒgt. Eigene Darstellung.

Bubble Sort ​

Bubble Sort ist ein einfacher Sortieralgorithmus. Er vergleicht immer benachbarte Elemente und vertauscht sie, wenn sie in der falschen Reihenfolge stehen.

Beispiel:

txt
[5, 2, 8, 1]

Erster Durchlauf:

  • Vergleiche 5 und 2 → vertauschen: [2, 5, 8, 1]
  • Vergleiche 5 und 8 → nichts tun: [2, 5, 8, 1]
  • Vergleiche 8 und 1 → vertauschen: [2, 5, 1, 8]

Nach einem vollstĂ€ndigen Durchlauf steht das grĂ¶ĂŸte Element am Ende.

Merke

Bei Bubble Sort „wandern“ große Werte Schritt fĂŒr Schritt nach rechts.

Visualisierung von Bubble Sort: Benachbarte Elemente werden verglichen und vertauscht.
Abb.: Bubble Sort: Benachbarte Elemente werden verglichen und bei falscher Reihenfolge vertauscht. Dadurch wandern große Elemente schrittweise nach hinten. Eigene Darstellung.

Bubble Sort in Python ​

python
def bubble_sort(liste):
    n = len(liste)

    for durchlauf in range(n):
        for i in range(0, n - 1 - durchlauf):
            if liste[i] > liste[i + 1]:
                liste[i], liste[i + 1] = liste[i + 1], liste[i]

    return liste


werte = [5, 2, 8, 1]
print(bubble_sort(werte))

Bubble Sort ist leicht verstĂ€ndlich, aber bei großen Listen meist nicht effizient.

Bubble Sort mit Abbruch ​

Eine optimierte Variante merkt sich, ob in einem Durchlauf ĂŒberhaupt vertauscht wurde. Wenn nichts vertauscht wurde, ist die Liste bereits sortiert.

python
def bubble_sort_mit_abbruch(liste):
    n = len(liste)

    for durchlauf in range(n):
        getauscht = False

        for i in range(0, n - 1 - durchlauf):
            if liste[i] > liste[i + 1]:
                liste[i], liste[i + 1] = liste[i + 1], liste[i]
                getauscht = True

        if not getauscht:
            break

    return liste


werte = [1, 2, 3, 4, 5]
print(bubble_sort_mit_abbruch(werte))

Merksatz

Der Abbruch spart Zeit, wenn die Liste bereits sortiert ist oder frĂŒh sortiert wird.

Code-Tracing bei Sortieralgorithmen ​

Beim Code-Tracing wird ein Programm Schritt fĂŒr Schritt nachvollzogen. Dabei notiert man, wie sich Variablen und Listen verĂ€ndern.

Beispiel:

python
werte = [4, 1, 3]

for i in range(len(werte) - 1):
    if werte[i] > werte[i + 1]:
        werte[i], werte[i + 1] = werte[i + 1], werte[i]

Ablauf:

iVergleichTausch?Liste danach
04 > 1ja[1, 4, 3]
14 > 3ja[1, 3, 4]

Merke

Code-Tracing zeigt, wie ein Algorithmus tatsÀchlich arbeitet. Das ist besonders hilfreich bei Schleifen, Bedingungen und ListenverÀnderungen.

📝 Übung: Code-Tracing ​

Gegeben ist der Code:

python
zahlen = [7, 3, 5]

for i in range(len(zahlen) - 1):
    if zahlen[i] > zahlen[i + 1]:
        zahlen[i], zahlen[i + 1] = zahlen[i + 1], zahlen[i]

print(zahlen)
  1. Notiere fĂŒr jeden Schleifendurchlauf den Wert von i.
  2. Notiere, welche zwei Werte verglichen werden.
  3. Notiere, ob getauscht wird.
  4. Gib die Liste nach jedem Durchlauf an.
Lösung

Start:

txt
[7, 3, 5]
iVergleichTausch?Liste danach
07 > 3ja[3, 7, 5]
17 > 5ja[3, 5, 7]

Ausgabe:

txt
[3, 5, 7]

Vertiefung: Rekursion ​

Rekursion bedeutet, dass eine Funktion sich selbst aufruft.

Ein rekursiver Algorithmus braucht immer:

  • einen Rekursionsanker, also einen Fall, in dem die Rekursion endet,
  • einen Rekursionsschritt, bei dem das Problem verkleinert und erneut bearbeitet wird.

Ein einfaches Beispiel ist die Summe aller Zahlen von n bis 1.

python
def summe_bis(n):
    if n <= 0:
        return 0
    else:
        return n + summe_bis(n - 1)

FĂŒr summe_bis(4) entsteht gedanklich:

txt
4 + 3 + 2 + 1

Wichtig

Ohne Rekursionsanker wĂŒrde sich eine Funktion immer weiter selbst aufrufen. Dann entsteht eine endlose Rekursion.

Quicksort ​

Quicksort ist ein schneller Sortieralgorithmus, der rekursiv arbeitet. Er folgt dem Prinzip Teile und herrsche.

Die Grundidee:

  1. WĂ€hle ein Element als Vergleichswert. Dieses Element nennt man Pivot.
  2. Teile die ĂŒbrigen Elemente auf:
    • kleinere Werte links,
    • grĂ¶ĂŸere Werte rechts.
  3. Sortiere die linke und rechte Teilliste wieder auf dieselbe Weise.
  4. Setze die Teile zusammen.

Beispiel:

txt
[8, 3, 10, 1, 6]

WĂ€hle 8 als Pivot.

Kleinere Werte:

txt
[3, 1, 6]

GrĂ¶ĂŸere Werte:

txt
[10]

Dann werden die Teillisten weiter sortiert.

Merke

Quicksort zerlegt ein großes Sortierproblem in kleinere Sortierprobleme.

Visualisierung von Quicksort: Pivot-Elemente teilen Listen rekursiv in kleinere und grĂ¶ĂŸere Werte.
Abb.: Quicksort: AuffĂ€llige Pivot-Elemente teilen die Liste in kleinere und grĂ¶ĂŸere Werte. Die entstehenden Teillisten werden erneut mit Pivot-Elementen aufgeteilt und schließlich zur sortierten Liste zusammengesetzt. Eigene Darstellung.

Quicksort in Python ​

python
def quicksort(liste):
    if len(liste) <= 1:
        return liste

    pivot = liste[0]
    kleiner = []
    groesser = []

    for element in liste[1:]:
        if element <= pivot:
            kleiner.append(element)
        else:
            groesser.append(element)

    return quicksort(kleiner) + [pivot] + quicksort(groesser)


werte = [8, 3, 10, 1, 6]
print(quicksort(werte))

Quicksort ist in der Praxis oft sehr schnell. Der ungĂŒnstige Fall kann aber auftreten, wenn das Pivot-Element schlecht gewĂ€hlt wird.

Sortieralgorithmen vergleichen ​

AlgorithmusGrundideeVorteilGrenze
Selection Sortkleinstes Element suchen und nach vorne tauschenleicht verstÀndlichviele Vergleiche
Insertion SortElemente in sortierten Bereich einfĂŒgengut bei fast sortierten Datenbei großen unsortierten Listen langsam
Bubble Sortbenachbarte Elemente vergleichen und tauschensehr gut sichtbar und nachvollziehbarbei großen Listen ineffizient
QuicksortPivot wÀhlen und rekursiv aufteilenim Durchschnitt sehr effizientim Worst Case quadratisch

Wichtig

Ein Algorithmus kann didaktisch gut geeignet sein, obwohl er praktisch nicht der effizienteste ist. Bubble Sort ist leicht zu verstehen, wird aber fĂŒr große Datenmengen selten bevorzugt.

KomplexitĂ€tsklassen ​

Bei Algorithmen interessiert nicht nur, wie viele Schritte sie bei einer bestimmten Liste brauchen. Wichtiger ist oft die Frage:

Wie wĂ€chst der Aufwand, wenn die Datenmenge grĂ¶ĂŸer wird?

DafĂŒr verwendet man sogenannte KomplexitĂ€tsklassen. Sie beschreiben das Wachstum des Aufwands in AbhĂ€ngigkeit von der ProblemgrĂ¶ĂŸe n.

Typische KomplexitÀtsklassen sind:

SchreibweiseBezeichnungBedeutung
O(1)konstantDer Aufwand bleibt ungefĂ€hr gleich, egal wie groß n ist.
O(log n)logarithmischDer Aufwand wÀchst sehr langsam.
O(n)linearDer Aufwand wÀchst ungefÀhr proportional zur Datenmenge.
O(n log n)linearithmisch / quasilinearDer Aufwand wÀchst schneller als linear, aber deutlich langsamer als quadratisch.
O(nÂČ)quadratischDer Aufwand wĂ€chst stark, weil hĂ€ufig verschachtelte Vergleiche nötig sind.
O(2ⁿ)exponentiellDer Aufwand wÀchst extrem stark mit jedem zusÀtzlichen Element.
O(n!)faktoriellDer Aufwand wÀchst noch stÀrker; typisch bei vollstÀndigem Durchprobieren vieler Anordnungen.

Merke

KomplexitĂ€tsklassen beschreiben nicht die exakte Laufzeit in Sekunden, sondern das Wachstum des Aufwands bei grĂ¶ĂŸer werdenden Datenmengen.

Übersicht ĂŒber typische KomplexitĂ€tsklassen der O-Notation.
Abb.: Übersicht ĂŒber typische KomplexitĂ€tsklassen der O-Notation. Die Achse „relativer Aufwand“ ist normiert; die Grafik zeigt daher das Wachstumsverhalten, nicht konkrete Sekundenwerte. Eigene Darstellung.

Beispiele fĂŒr KomplexitĂ€tsklassen ​

Konstanter Aufwand: O(1) ​

Der Aufwand bleibt ungefĂ€hr gleich, egal wie groß die Datenmenge ist.

Beispiel:

python
erstes_element = liste[0]

Der Zugriff auf ein bestimmtes Listenelement ĂŒber seinen Index benötigt nicht mehr Schritte, nur weil die Liste grĂ¶ĂŸer wird.

Logarithmischer Aufwand: O(log n) ​

Der Aufwand wÀchst sehr langsam.

Beispiel:

txt
BinÀre Suche

Bei jedem Schritt wird der Suchbereich halbiert.

txt
1 000 Elemente      → ungefĂ€hr 10 Vergleiche
1 000 000 Elemente  → ungefĂ€hr 20 Vergleiche

Merke

O(log n) ist sehr effizient, weil bei jedem Schritt ein großer Teil des Problems ausgeschlossen wird.

Linearer Aufwand: O(n) ​

Der Aufwand wÀchst ungefÀhr proportional zur Anzahl der Elemente.

Beispiel:

txt
Lineare Suche

Im schlechtesten Fall wird jedes Element einmal geprĂŒft.

txt
10 Elemente     → bis zu 10 Vergleiche
100 Elemente    → bis zu 100 Vergleiche
10 000 Elemente → bis zu 10 000 Vergleiche

Linearithmischer Aufwand: O(n log n) ​

Der Aufwand wÀchst etwas schneller als linear, aber deutlich langsamer als quadratisch.

Typische Beispiele:

  • Quicksort im Durchschnitt,
  • Mergesort,
  • Heapsort.

Bei solchen Verfahren wird die Datenmenge oft sinnvoll in Teilprobleme zerlegt, die anschließend effizient bearbeitet werden.

Quadratischer Aufwand: O(nÂČ) ​

Der Aufwand wÀchst stark, weil hÀufig viele Elemente mit vielen anderen Elementen verglichen werden.

Typische Beispiele:

  • Selection Sort,
  • Bubble Sort,
  • Insertion Sort im durchschnittlichen und schlechten Fall.
txt
10 Elemente     → ungefĂ€hr 100 als GrĂ¶ĂŸenordnung
100 Elemente    → ungefĂ€hr 10 000 als GrĂ¶ĂŸenordnung
10 000 Elemente → ungefĂ€hr 100 000 000 als GrĂ¶ĂŸenordnung

Wichtig

Quadratische Algorithmen können bei kleinen Datenmengen völlig ausreichend sein, werden aber bei großen Datenmengen schnell problematisch.

KomplexitĂ€t von Such- und Sortierverfahren ​

VerfahrenBest CaseAverage CaseWorst CaseKurzbegrĂŒndung
Lineare SucheO(1)O(n)O(n)Im besten Fall steht das Element vorne, sonst muss viel geprĂŒft werden.
BinÀre SucheO(1)O(log n)O(log n)Der Suchbereich wird immer halbiert.
Selection SortO(nÂČ)O(nÂČ)O(nÂČ)Das kleinste Element muss wiederholt im Restbereich gesucht werden.
Bubble SortO(n) mit AbbruchO(nÂČ)O(nÂČ)Bei bereits sortierter Liste kann frĂŒh abgebrochen werden; sonst viele Vergleiche.
Insertion SortO(n)O(nÂČ)O(nÂČ)Bei fast sortierten Daten gĂŒnstig, sonst viele Verschiebungen.
QuicksortO(n log n)O(n log n)O(nÂČ)Gute Pivot-Aufteilung ist effizient; schlechte Pivot-Wahl fĂŒhrt zu ungĂŒnstiger Rekursion.

Strategie

Wenn du KomplexitÀtsklassen erklÀrst, nenne immer auch den Kontext:

  • Geht es um Suchen oder Sortieren?
  • Ist die Liste sortiert oder unsortiert?
  • Wird einmal gesucht oder sehr oft?
  • Geht es um kleine oder große Datenmengen?
  • Wird der Best Case, Worst Case oder Average Case betrachtet?

Quicksort und O(n log n) ​

Quicksort arbeitet im Durchschnitt sehr effizient, weil die Liste durch das Pivot-Element in kleinere Teillisten aufgeteilt wird.

Wenn das Pivot-Element die Liste ungefĂ€hr halbiert, entstehen ungefĂ€hr log₂(n) Rekursionsebenen. Auf jeder Ebene mĂŒssen die Elemente mit dem Pivot verglichen werden.

Daher ergibt sich im gĂŒnstigen und durchschnittlichen Fall ungefĂ€hr:

txt
n · log₂(n)

also:

txt
O(n log n)

Im ungĂŒnstigen Fall wird das Pivot-Element aber sehr schlecht gewĂ€hlt. Wenn es immer das kleinste oder grĂ¶ĂŸte Element ist, entsteht jedes Mal eine fast gleich große Restliste. Dann Ă€hnelt der Aufwand wieder einer quadratischen Struktur:

txt
O(nÂČ)

Merke

Quicksort ist im Durchschnitt sehr schnell, kann aber im schlechtesten Fall deutlich ineffizienter werden.

Vergleich von n log n und nÂČ â€‹

Der Unterschied zwischen O(n log n) und O(nÂČ) wird bei großen Datenmengen besonders deutlich. Bei kleinen Datenmengen können konstante Faktoren und Implementierungsdetails den praktischen Vergleich zunĂ€chst ĂŒberlagern.

Beispielhaft:

ProblemgrĂ¶ĂŸe nn log₂(n) ungefĂ€hrnÂČ
1033100
10066410 000
1 0009 9661 000 000
10 000132 877100 000 000

Wichtig

Bei kleinen Datenmengen wirken Sortierverfahren oft Ă€hnlich schnell. Bei großen Datenmengen entscheiden KomplexitĂ€tsklassen darĂŒber, ob ein Verfahren praktisch sinnvoll ist.

Detailvergleich von n log n und nÂČ bei kleinen Datenmengen mit modelliertem konstantem Faktor.
Abb.: Detailansicht bei kleinen Datenmengen. Der konstante Faktor bei 4 · n · log₂(n) verdeutlicht, dass konkrete Implementierungen trotz besserer KomplexitĂ€tsklasse anfangs mehr Aufwand verursachen können. Eigene Darstellung.

Elementaroperationen beim Sortieren ​

Beim Sortieren kann man verschiedene Arten von Arbeitsschritten zÀhlen.

Wichtige Elementaroperationen sind:

OperationBedeutung
VergleichZwei Werte werden verglichen.
VerschiebungEin Wert wird an eine andere Stelle verschoben.
VertauschungZwei Werte tauschen ihre PlÀtze.

Eine Vertauschung ist aufwendiger als eine einfache Verschiebung, weil dafĂŒr mehrere Zuweisungen nötig sind.

Beispiel fĂŒr eine Vertauschung:

python
zwischenspeicher = liste[i]
liste[i] = liste[i + 1]
liste[i + 1] = zwischenspeicher

In Python kann man das kĂŒrzer schreiben:

python
liste[i], liste[i + 1] = liste[i + 1], liste[i]

Merke

Effizienz kann man nicht nur ĂŒber die Anzahl der SchleifendurchlĂ€ufe betrachten. Auch Vergleiche, Verschiebungen und Vertauschungen verursachen Aufwand.

Sortieren mit Karten verstehen ​

Sortieralgorithmen lassen sich gut mit Karten erklÀren.

FĂŒr Selection Sort:

  1. Lege mehrere Zahlenkarten nebeneinander.
  2. Suche das kleinste Element im unsortierten Bereich.
  3. Tausche es nach vorne.
  4. Markiere den sortierten Bereich.
  5. Wiederhole das Vorgehen.

FĂŒr Insertion Sort:

  1. Betrachte die erste Karte als sortierten Bereich.
  2. Nimm die nÀchste Karte.
  3. FĂŒge sie an der richtigen Stelle in den sortierten Bereich ein.
  4. Wiederhole das Vorgehen.

FĂŒr Bubble Sort:

  1. Vergleiche immer zwei benachbarte Karten.
  2. Vertausche sie, wenn sie falsch liegen.
  3. Gehe bis zum Ende der Reihe.
  4. Wiederhole den Vorgang, bis keine Vertauschung mehr nötig ist.

FĂŒr Quicksort:

  1. WĂ€hle eine Karte als Pivot.
  2. Lege kleinere Werte links ab.
  3. Lege grĂ¶ĂŸere Werte rechts ab.
  4. Wiederhole das Vorgehen fĂŒr die Teilgruppen.
  5. Setze die sortierten Gruppen wieder zusammen.

Strategie

Wenn du einen Algorithmus mit Karten erklÀrst, sprich jeden Schritt laut mit: Was wird verglichen? Warum wird getauscht? Welcher Bereich ist bereits erledigt?

Algorithmen bewerten ​

Beim Vergleichen von Algorithmen helfen Leitfragen:

  • Funktioniert der Algorithmus fĂŒr alle gĂŒltigen Eingaben?
  • Welche Voraussetzungen braucht er?
  • Wie viele Schritte benötigt er ungefĂ€hr?
  • Wie verhĂ€lt er sich im Best Case, Worst Case und Average Case?
  • Zu welcher KomplexitĂ€tsklasse gehört er?
  • Ist er leicht zu verstehen?
  • Ist er leicht zu programmieren?
  • Ist er fĂŒr große Datenmengen geeignet?
  • Muss vorher sortiert oder vorbereitet werden?
  • Gibt es einen Zielkonflikt zwischen Effizienz und VerstĂ€ndlichkeit?

Merke

Die Wahl eines Algorithmus hÀngt vom Problem, von der Datenmenge, von den Voraussetzungen und vom praktischen Einsatz ab.

Effizienz kritisch reflektieren ​

Effizienz ist nicht nur eine technische Frage.

Wenn Programme mit sehr großen Datenmengen arbeiten, können ineffiziente Algorithmen Folgen haben:

  • lĂ€ngere Wartezeiten,
  • höhere Serverlast,
  • mehr Energieverbrauch,
  • höhere Kosten,
  • schlechtere Nutzbarkeit,
  • langsamere Auswertung wichtiger Daten,
  • ökologische Auswirkungen durch höheren Ressourcenverbrauch.

Gleichzeitig ist der effizienteste Algorithmus nicht immer automatisch die beste Wahl.

Manchmal sind andere Kriterien wichtig:

  • VerstĂ€ndlichkeit,
  • Wartbarkeit,
  • Nachvollziehbarkeit,
  • FehleranfĂ€lligkeit,
  • Fairness,
  • Transparenz.

Wichtig

Ein sehr effizienter Algorithmus kann schwer verstĂ€ndlich sein. Ein einfacher Algorithmus kann leichter ĂŒberprĂŒfbar sein. In der Praxis muss man oft zwischen Effizienz und Nachvollziehbarkeit abwĂ€gen.

Typische MissverstĂ€ndnisse ​

„Wenn ein Algorithmus funktioniert, ist er automatisch gut.“ ​

Nicht unbedingt. Er kann korrekt sein, aber bei großen Datenmengen viel zu langsam werden.

„BinĂ€re Suche ist immer besser als lineare Suche.“ ​

Nicht immer. BinÀre Suche braucht eine sortierte Liste. Bei sehr kleinen oder einmaligen SuchvorgÀngen kann lineare Suche einfacher und ausreichend sein.

„Sortieren lohnt sich immer.“ ​

Nein. Sortieren kostet selbst Aufwand. Es lohnt sich vor allem, wenn danach oft gesucht oder weiterverarbeitet wird.

„Bubble Sort ist schlecht, weil er langsam ist.“ ​

Bubble Sort ist fĂŒr große Listen ineffizient, aber didaktisch sehr nĂŒtzlich, weil man daran Vergleiche, Vertauschungen und Schleifen gut versteht.

„Quicksort ist immer schnell.“ ​

Quicksort ist oft schnell, kann aber im ungĂŒnstigen Fall langsamer werden, wenn die Aufteilung sehr ungleich ist.

„KomplexitĂ€tsklassen geben die genaue Laufzeit in Sekunden an.“ ​

Nein. KomplexitÀtsklassen beschreiben das Wachstum des Aufwands, nicht die konkrete Laufzeit auf einem bestimmten Computer.

PrĂŒfungsvorbereitung ​

Die folgenden Aufgaben trainieren dieselben Kompetenzen, verwenden aber andere Kontexte, Daten und Beispiele.

📝 Übung: Algorithmus erklĂ€ren ​

ErklÀre, warum die folgende Handlung als Algorithmus beschrieben werden kann:

Eine App prĂŒft, ob ein eingegebener Rabattcode in einer Liste gĂŒltiger Codes vorkommt.

Gehe dabei auf folgende Punkte ein:

  1. Eingabe
  2. Verarbeitung
  3. Ausgabe
  4. Eindeutigkeit der Schritte
  5. Endlichkeit
Lösungshinweis

Die Eingabe ist der Rabattcode. Die Verarbeitung besteht darin, den Code mit gespeicherten gĂŒltigen Codes zu vergleichen. Die Ausgabe ist zum Beispiel gĂŒltig oder ungĂŒltig.

Die Schritte mĂŒssen eindeutig sein, damit klar ist, welcher Code wann geprĂŒft wird. Der Algorithmus ist endlich, wenn die Liste nach einer bestimmten Anzahl von Vergleichen vollstĂ€ndig geprĂŒft wurde.

📝 Übung: Lineare Suche implementieren ​

Schreibe eine Funktion finde_artikel(liste, artikelnummer), die ĂŒberprĂŒft, ob eine Artikelnummer in einer Liste vorkommt.

Die Funktion soll True zurĂŒckgeben, wenn die Nummer gefunden wurde, sonst False.

Lösung
python
def finde_artikel(liste, artikelnummer):
    for nummer in liste:
        if nummer == artikelnummer:
            return True

    return False


artikel = [104, 118, 203, 260, 315]

print(finde_artikel(artikel, 203))
print(finde_artikel(artikel, 999))

📝 Übung: BinĂ€re Suche gedanklich durchfĂŒhren ​

Gegeben ist die sortierte Liste:

txt
[3, 7, 12, 18, 25, 31, 44, 58, 63]

Gesucht wird 44.

  1. Bestimme das mittlere Element.
  2. Entscheide, ob links oder rechts weitergesucht wird.
  3. Wiederhole den Vorgang, bis der Wert gefunden ist.
  4. Notiere alle verglichenen Werte.
Lösung

Startliste:

txt
[3, 7, 12, 18, 25, 31, 44, 58, 63]

Mitte: 25
44 ist grĂ¶ĂŸer, also rechts weitersuchen.

Neuer Bereich:

txt
[31, 44, 58, 63]

Mitte ungefÀhr: 44
gefunden.

Verglichene Werte:

txt
25, 44

📝 Übung: Sortieren oder nicht? ​

Eine App verwaltet 30 gespeicherte Lieblingssongs. Eine andere App verwaltet 2 Millionen DatensÀtze.

  1. ErklÀre, warum lineare Suche bei 30 Songs oft ausreicht.
  2. ErklÀre, warum bei 2 Millionen DatensÀtzen andere Strategien sinnvoll werden.
  3. BegrĂŒnde, wann Sortieren vor dem Suchen sinnvoll sein kann.
Lösungshinweis

Bei 30 Songs ist der Aufwand gering. Selbst wenn alle EintrĂ€ge geprĂŒft werden, ist das meistens unproblematisch.

Bei 2 Millionen DatensÀtzen kann lineare Suche sehr viele Vergleiche benötigen. Wenn oft gesucht wird, lohnt sich eine sortierte Struktur oder ein anderer effizienter Zugriff.

Sortieren lohnt sich besonders, wenn dieselbe Datenmenge hÀufig durchsucht wird.

📝 Übung: Selection Sort nachvollziehen ​

Sortiere die Liste gedanklich mit Selection Sort:

txt
[7, 2, 6, 4]

Notiere nach jedem Durchlauf den Zustand der Liste.

Lösung

Start:

txt
[7, 2, 6, 4]

Erster Durchlauf: kleinstes Element ist 2, Tausch mit 7.

txt
[2, 7, 6, 4]

Zweiter Durchlauf: kleinstes Element im Restbereich ist 4, Tausch mit 7.

txt
[2, 4, 6, 7]

Dritter Durchlauf: 6 ist bereits an der richtigen Stelle.

txt
[2, 4, 6, 7]

📝 Übung: Vertiefung – Insertion Sort nachvollziehen ​

Sortiere die Liste gedanklich mit Insertion Sort:

txt
[5, 3, 8, 2]

Beschreibe, wie der sortierte Bereich Schritt fĂŒr Schritt wĂ€chst.

Lösung

Start:

txt
[5, 3, 8, 2]

5 gilt als sortierter Bereich.

3 wird vor 5 eingefĂŒgt:

txt
[3, 5, 8, 2]

8 bleibt hinter 5:

txt
[3, 5, 8, 2]

2 wird ganz vorne eingefĂŒgt:

txt
[2, 3, 5, 8]

📝 Übung: Bubble Sort nachvollziehen ​

Sortiere die Liste gedanklich mit Bubble Sort:

txt
[6, 2, 9, 4]

Notiere nach jedem vollstÀndigen Durchlauf den Zustand der Liste.

Lösung

Start:

txt
[6, 2, 9, 4]

Erster Durchlauf:

  • 6 und 2 tauschen → [2, 6, 9, 4]
  • 6 und 9 bleiben → [2, 6, 9, 4]
  • 9 und 4 tauschen → [2, 6, 4, 9]

Zweiter Durchlauf:

  • 2 und 6 bleiben → [2, 6, 4, 9]
  • 6 und 4 tauschen → [2, 4, 6, 9]

Dritter Durchlauf:

  • keine Änderung nötig

Sortierte Liste:

txt
[2, 4, 6, 9]

📝 Übung: Quicksort-Prinzip erklĂ€ren ​

Gegeben ist die Liste:

txt
[9, 4, 12, 2, 7]

WĂ€hle 9 als Pivot.

  1. Teile die ĂŒbrigen Werte in kleinere und grĂ¶ĂŸere Werte auf.
  2. ErklÀre, wie die Teillisten weiter sortiert werden.
  3. Beschreibe das Prinzip „Teile und herrsche“.
Lösung

Pivot:

txt
9

Kleinere Werte:

txt
[4, 2, 7]

GrĂ¶ĂŸere Werte:

txt
[12]

Die Teilliste [4, 2, 7] wird wieder nach demselben Prinzip sortiert. Das Problem wird also in kleinere Teilprobleme zerlegt. Danach werden die sortierten Teile zusammengesetzt.

📝 Übung: KomplexitĂ€tsklassen zuordnen ​

Ordne die folgenden Verfahren einer passenden KomplexitĂ€tsklasse zu und begrĂŒnde kurz:

  1. Lineare Suche in einer unsortierten Liste
  2. BinÀre Suche in einer sortierten Liste
  3. Bubble Sort
  4. Selection Sort
  5. Vertiefung: Insertion Sort im durchschnittlichen Fall
  6. Quicksort im durchschnittlichen Fall
  7. Quicksort im ungĂŒnstigen Fall
Lösung
  1. Lineare Suche: O(n), weil im schlechtesten Fall jedes Element geprĂŒft wird.
  2. BinÀre Suche: O(log n), weil der Suchbereich in jedem Schritt halbiert wird.
  3. Bubble Sort: O(nÂČ), weil viele benachbarte Vergleiche und Vertauschungen nötig sind.
  4. Selection Sort: O(nÂČ), weil wiederholt das kleinste Element im unsortierten Bereich gesucht wird.
  5. Vertiefung: Insertion Sort liegt im Durchschnitt bei O(nÂČ), weil hĂ€ufig viele Verschiebungen nötig sind.
  6. Quicksort im Durchschnitt: O(n log n), weil die Liste meist sinnvoll aufgeteilt wird.
  7. Quicksort im ungĂŒnstigen Fall: O(nÂČ), wenn das Pivot-Element die Liste sehr schlecht aufteilt.

📝 Übung: Wachstum vergleichen ​

ErklĂ€re, warum ein Algorithmus mit O(n log n) bei großen Datenmengen meist deutlich besser geeignet ist als ein Algorithmus mit O(nÂČ).

Lösungshinweis

Bei O(nÂČ) wĂ€chst der Aufwand quadratisch. Verdoppelt sich die Datenmenge, kann sich der Aufwand ungefĂ€hr vervierfachen.

Bei O(n log n) wĂ€chst der Aufwand deutlich langsamer. Deshalb sind Verfahren wie Quicksort im durchschnittlichen Fall fĂŒr große Datenmengen meist wesentlich geeigneter als einfache quadratische Sortierverfahren.

Ich kann 
 ​

Nach der Wiederholung dieses Themenbereichs solltest du Folgendes können:

  • Ich kann erklĂ€ren, was ein Algorithmus ist.
  • Ich kann grundlegende Eigenschaften von Algorithmen nennen und beschreiben.
  • Ich kann Determinismus und Determiniertheit unterscheiden.
  • Ich kann erklĂ€ren, was Effizienz bei Algorithmen bedeutet.
  • Ich kann das Laufzeitverhalten eines Algorithmus beschreiben.
  • Ich kann Best Case, Worst Case und Average Case unterscheiden.
  • Ich kann die lineare Suche erklĂ€ren und an einem Beispiel durchfĂŒhren.
  • Ich kann die binĂ€re Suche erklĂ€ren und ihre Voraussetzung nennen.
  • Ich kann lineare und binĂ€re Suche vergleichen.
  • Ich kann beurteilen, wann Sortieren vor dem Suchen sinnvoll ist.
  • Ich kann einfache Suchalgorithmen in Python lesen und schreiben.
  • Ich kann Selection Sort Schritt fĂŒr Schritt erklĂ€ren.
  • Ich kann Bubble Sort Schritt fĂŒr Schritt erklĂ€ren.
  • Ich kann Quicksort als rekursives Teile-und-herrsche-Verfahren beschreiben.
  • Ich kann einfache Sortieralgorithmen mit Karten oder Listen demonstrieren.
  • Ich kann Code-Tracing bei Schleifen, Bedingungen und Listen durchfĂŒhren.
  • Ich kann KomplexitĂ€tsklassen wie O(log n), O(n), O(n log n) und O(nÂČ) unterscheiden.
  • Ich kann typische Laufzeitklassen von Such- und Sortierverfahren zuordnen.
  • Ich kann begrĂŒnden, warum O(n log n) bei großen Datenmengen meist gĂŒnstiger ist als O(nÂČ).
  • Ich kann Algorithmen hinsichtlich VerstĂ€ndlichkeit, Korrektheit und Effizienz bewerten.
  • Ich kann erklĂ€ren, warum der passende Algorithmus vom konkreten Anwendungsfall abhĂ€ngt.
  • Ich kann gesellschaftliche, wirtschaftliche und ökologische Folgen ineffizienter Algorithmen reflektieren.

Mini-Check ​

Beantworte zum Abschluss kurz:

  1. Welche Eigenschaften sollte ein Algorithmus besitzen?
  2. Was ist der Unterschied zwischen Determinismus und Determiniertheit?
  3. Wie funktioniert lineare Suche grundsÀtzlich?
  4. Welche Voraussetzung braucht binÀre Suche?
  5. Warum ist binĂ€re Suche bei großen sortierten Listen effizienter als lineare Suche?
  6. Was bedeuten best case, average case und worst case?
  7. Wie funktioniert Bubble Sort grundsÀtzlich?
  8. Wie funktioniert Quicksort grundsÀtzlich?
  9. Warum kann die Wahl des Pivot-Elements bei Quicksort wichtig sein?
  10. Welche KomplexitÀtsklasse passt typischerweise zu Bubble Sort im schlechten Fall?
  11. Welche KomplexitÀtsklasse passt typischerweise zu einem guten Quicksort-Verlauf?
  12. Wann kann es sinnvoll sein, vor dem Suchen zuerst zu sortieren?
  13. Warum ist Effizienz auch gesellschaftlich oder ökologisch relevant?
Kurzlösungen
  1. Er sollte eindeutig, ausfĂŒhrbar, endlich und nachvollziehbar sein und Eingaben zu Ausgaben verarbeiten.
  2. Determinismus betrifft die Eindeutigkeit jedes nÀchsten Schritts; Determiniertheit bedeutet, dass bei gleicher Eingabe dasselbe Ergebnis entsteht.
  3. Die Liste wird Element fĂŒr Element durchsucht, bis der Wert gefunden wird oder die Liste endet.
  4. Die Liste muss sortiert sein.
  5. Der Suchbereich wird in jedem Schritt ungefÀhr halbiert.
  6. Best case: gĂŒnstigster Fall; average case: durchschnittlicher Fall; worst case: ungĂŒnstigster Fall.
  7. Benachbarte Elemente werden verglichen und bei falscher Reihenfolge vertauscht; große Elemente wandern schrittweise nach hinten.
  8. Ein Pivot wird gewĂ€hlt, die Liste wird in kleinere und grĂ¶ĂŸere Elemente geteilt und diese Teile werden weiter sortiert.
  9. Ein ungĂŒnstiges Pivot kann sehr ungleich große Teilprobleme erzeugen und die Laufzeit verschlechtern.
  10. O(nÂČ).
  11. O(n log n).
  12. Bei vielen Suchanfragen auf derselben Datenmenge, besonders wenn die Datenmenge groß ist.
  13. Langsame oder verschwenderische Algorithmen kosten Zeit, Energie und Ressourcen und können digitale Systeme unzuverlÀssig machen.