Skip to content
IRC-CodingIRC-Coding
AlgorithmenStandardalgorithmenLineare SucheBinäre SucheBubblesortSelection SortInsertion SortSortieralgorithmenSuchalgorithmenBig-OKomplexitaetDatenstrukturenPythonJava

Standardalgorithmen: Suche, lineare und binäre Suche, Sortierung, Bubblesort, Selection, Insertion

Lerne die wichtigsten Standardalgorithmen für Suche und Sortierung: lineare Suche, binäre Suche, Bubblesort, Selection Sort und Insertion Sort. Inklusive Komplexität und Codebeispielen.

S

schutzgeist

9 min read
Standardalgorithmen: Suche, lineare und binäre Suche, Sortierung, Bubblesort, Selection, Insertion

Standardalgorithmen: Suche, lineare und binäre Suche, Sortierung, Bubblesort, Selection, Insertion

Suchen und Sortieren gehören zu den grundlegendsten Operationen in der Softwareentwicklung. In diesem Artikel lernst Du fünf wichtige Standardalgorithmen kennen: lineare Suche, binäre Suche, Bubblesort, Selection Sort und Insertion Sort. Für jeden Algorithmen erkläre ich die Funktionsweise, die Zeitkomplexität in Big-O-Notation und ein Codebeispiel in Python.

Egal ob AP1, Studium oder irgendeine andere IT-Ausbildung, Suchen und Sortieren wird immer “abgefragt” oder “erwartet”. Aber in der Regel nur einfache Bubblesorts oder vielleicht auch nur das Abfragen von Arrays oder das Sortieren von Arrays.

Du solltest Dur die wichtigsten Algorithmen anschauen, weil Sie Dir auch das Leben erleichtern.

Denn Zeit ist Geld und hier fängt das erste Programmierdilemma schon an. Ab wann ist ein Algorithmus gut, wann ist der unbrauchbar ?

Je größer die Daten sind, desto sinnvoller ist die richtige herangehensweise.
Während es bei kleinen Datenmengen “gefühlt” keinen Unterschied macht, ob du 0.2 Sekunden wartest, oder 0.5… so kann es sich bei großen Datenmengen und viele Sekunden bis Minuten handeln.

Also bemessen wir Algorithmen nach … Geschwindigkeit. Unser Ziel ist es immer den schnellsten Algorithmus zu finden. Wir haben darüber bereits einen Artikel geschrieben, aber da es hier relavant ist, möchten wir es noch einmal kurz ewähnt haben:

Was bedeutet O(1), O(n), O(log n) und O(n²)?

Bevor wir die einzelnen Algorithmen betrachten, solltest Du verstehen, wie wir ihre Geschwindigkeit beschreiben. Dafür verwenden wir die Big-O-Notation. Sie sagt nicht, wie viele Millisekunden ein Algorithmus braucht, sondern wie stark die Laufzeit mit der Menge der Daten wächst.

Hier die wichtigsten Klassen im Überblick:

  • O(1) – konstant: Die Laufzeit bleibt gleich, egal wie viele Daten vorhanden sind. Ein Beispiel ist der Zugriff auf ein Array-Element über einen Index.
  • O(log n) – logarithmisch: Die Laufzeit wächst sehr langsam. Die binäre Suche halbiert in jedem Schritt den Suchbereich, deshalb ist sie O(log n).
  • O(n) – linear: Die Laufzeit wächst proportional zur Datenmenge. Wenn Du 1.000 Elemente hast, brauchst Du etwa doppelt so lange wie bei 500 Elementen.
  • O(n²) – quadratisch: Die Laufzeit wächst sehr schnell. Bei doppelter Datenmenge brauchst Du etwa vier Mal so lange. Viele einfache Sortieralgorithmen haben diese Komplexität.

Die Big-O-Notation beschreibt immer den Worst Case, also das ungünstigste Szenario. Das hilft Dir, die schlechteste Laufzeit abzuschätzen, die ein Algorithmus haben kann.

Eine detailliertere Erklärung findest Du im Artikel Big-O Notation: Laufzeitkomplexität und Effizienz O(1), O(n), O(log n) und in der Einführung zur Komplexitätsanalyse, Big-O, Such- und Sortieralgorithmen. Für die folgenden Algorithmen reicht es, wenn Du Dir unsere Auswertung anschaust und diese zwischen “GUT” und “WENIGER GUT” einschätzen kannst.

Lineare Suche

Die lineare Suche durchläuft eine Liste Element für Element, bis das gesuchte Element gefunden wird oder das Ende erreicht ist. Sie funktioniert auf sortierten und unsortierten Daten.

Du fängst also am Anfang einer Schlange an und gehst sie dann komplett durch, bis zum Ende. Vielleicht hast Du Glück, vielleicht ist es aber das letzte Element.

def lineare_suche(liste, ziel):
    for index, wert in enumerate(liste):
        if wert == ziel:
            return index
    return -1
  • Best Case: O(1) ( Gesuchtes Element ist weit vorne )
  • Worst Case: O(n) ( …zum Schluß…)
  • Average Case: O(n)

Die lineare Suche ist einfach, aber bei großen Datenmengen langsam.

Binäre Suche

Die binäre Suche halbiert den Suchbereich in jedem Schritt. Sie setzt voraus, dass die Liste sortiert ist. Im Vergleich zur linearen Suche ist sie bei großen Datenmengen deutlich schneller.

def binaere_suche(liste, ziel):
    links = 0
    rechts = len(liste) - 1

    while links <= rechts:
        mitte = (links + rechts) // 2
        if liste[mitte] == ziel:
            return mitte
        if liste[mitte] < ziel:
            links = mitte + 1
        else:
            rechts = mitte - 1

    return -1
  • Best Case: O(1)
  • Worst Case: O(log n)
  • Average Case: O(log n)

Bei einer Million Elementen benötigt die binäre Suche im Worst Case nur etwa 20 Vergleiche.

Wie viele wären es bei der Linearen ? ;)

Bubblesort

Bubblesort vergleicht wiederholt benachbarte Elemente und vertauscht sie, wenn sie in der falschen Reihenfolge stehen. Größere Elemente steigen dadurch nach und nach nach oben.

Dieser Algorithmus wird sehr gerne für Prüfungen oder einfachen Aufgaben genutzt.
Du solltest ihn Dir anschauen und später können.

def bubblesort(liste):
    n = len(liste)
    while True:
        vertauscht = False
        for i in range(n - 1):
            if liste[i] > liste[i + 1]:
                liste[i], liste[i + 1] = liste[i + 1], liste[i]
                vertauscht = True
        n -= 1
        if not vertauscht:
            break
    return liste
  • Best Case: O(n)
  • Worst Case: O(n²)
  • Average Case: O(n²)

Bubblesort ist einfach zu verstehen, aber für große Datenmengen ineffizient.

Selection Sort

Selection Sort sucht in jedem Durchgang das kleinste Element im unsortierten Bereich und fügt es am Ende des sortierten Bereichs ein.

def selection_sort(liste):
    n = len(liste)
    for i in range(n - 1):
        min_index = i
        for j in range(i + 1, n):
            if liste[j] < liste[min_index]:
                min_index = j
        liste[i], liste[min_index] = liste[min_index], liste[i]
    return liste
  • Best Case: O(n²)
  • Worst Case: O(n²)
  • Average Case: O(n²)

Selection Sort ist einfach, aber immer quadratisch. Er macht weniger Vertauschungen als Bubblesort.

Insertion Sort

Insertion Sort fügt jedes Element an der richtigen Stelle in den bereits sortierten Bereich ein. Das Vorgehen ähnelt dem Sortieren einer Hand beim Kartenspiel.

def insertion_sort(liste):
    for i in range(1, len(liste)):
        aktuelles = liste[i]
        j = i - 1
        while j >= 0 and liste[j] > aktuelles:
            liste[j + 1] = liste[j]
            j -= 1
        liste[j + 1] = aktuelles
    return liste
  • Best Case: O(n)
  • Worst Case: O(n²)
  • Average Case: O(n²)

Insertion Sort ist besonders effizient, wenn die Liste bereits fast sortiert ist.

Vergleich der Such- und Sortier-Algorithmen

AlgorithmusTypBest CaseWorst CaseEinsatzgebiet
Lineare SucheSucheO(1)O(n)Unsortierte kleine Datenmengen
Binäre SucheSucheO(1)O(log n)Sortierte große Datenmengen
BubblesortSortierungO(n)O(n²)Nur zu Lernzwecken
Selection SortSortierungO(n²)O(n²)Kleine Datenmengen, wenige Vertauschungen
Insertion SortSortierungO(n)O(n²)Fast sortierte Daten, kleine Listen

Wann welchen Algorithmus verwenden?

Für die Suche gilt:

  • Bei unsortierten Daten verwendest Du die lineare Suche.
  • Bei sortierten Daten verwendest Du die binäre Suche.

Für die Sortierung gilt:

  • Bubblesort eignet sich nur zum Lernen.
  • Selection Sort ist einfach, aber langsam.
  • Insertion Sort ist gut für kleine oder fast sortierte Datenmengen.
  • Für große Datenmengen verwendest Du besser Quicksort, Mergesort oder Heapsort.

**Lineare Suche, binäre Suche, Bubblesort, Selection Sort und Insertion Sort bilden das Fundament für das Verständnis von Algorithmen und Datenstrukturen. Sie sind einfach, lehrreich und zeigen gut, wie Big-O die Laufzeit beschreibt. In der Praxis kommen bei großen Datenmengen schnellere Algorithmen zum Einsatz, aber das Verständnis dieser fünf Standardalgorithmen ist essenziell für jeden Entwickler. **

Buchempfehlungen zu Algorithmen und Datenstrukturen

Wenn Du Dich weiter mit Algorithmen und Datenstrukturen beschäftigen möchtest, empfehlen wir Dir die folgenden Bücher:

Algorithmen & Datenstrukturen

Bücher über Algorithmen, Komplexitätsanalyse, Datenstrukturen und algorithmische Sicherheit

Algorithmen: Eine Einführung von Thomas H. Cormen u.a.

Algorithmen: Eine Einführung von Thomas H. Cormen u.a.

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

FAQ: Standardalgorithmen, Suche und Sortierung

1. Was ist ein Standardalgorithmus?

Ein Standardalgorithmus ist ein bewährtes Verfahren für häufig wiederkehrende Probleme wie Suchen, Sortieren oder Vergleichen. Diese Algorithmen bilden das Grundgerüst algorithmischen Denkens in der Softwareentwicklung.

2. Was ist der Unterschied zwischen Suche und Sortierung?

Suchen bedeutet, ein bestimmtes Element in einer Datenmenge zu finden. Sortieren bedeutet, die Elemente einer Datenmenge nach einer bestimmten Reihenfolge anzuordnen, beispielsweise aufsteigend oder alphabetisch.

3. Was ist eine lineare Suche?

Die lineare Suche durchläuft eine Liste Element für Element, bis das gesuchte Element gefunden wird oder das Ende der Liste erreicht ist. Sie funktioniert auf sortierten und unsortierten Daten und hat eine Laufzeit von O(n).

4. Wann verwendet man eine lineare Suche?

Die lineare Suche ist sinnvoll, wenn die Datenmenge klein ist oder die Daten nicht sortiert vorliegen. Bei sehr kleinen Listen ist sie oft schneller als komplexere Algorithmen, weil sie keinen Overhead benötigt.

5. Was ist eine binäre Suche?

Die binäre Suche halbiert den Suchbereich in jedem Schritt. Sie setzt voraus, dass die Daten sortiert sind, und hat eine Laufzeit von O(log n).

6. Warum ist die binäre Suche schneller als die lineare Suche?

Die binäre Suche ist schneller, weil sie in jedem Schritt den Suchbereich halbiert. Bei einer Million Elementen benötigt sie im Worst Case nur etwa 20 Vergleiche, während die lineare Suche bis zu eine Million Vergleiche braucht.

7. Welche Voraussetzung braucht die binäre Suche?

Die binäre Suche benötigt sortierte Daten. Ist die Liste nicht sortiert, muss sie zuerst sortiert werden oder es wird eine lineare Suche verwendet.

8. Was ist Bubblesort?

Bubblesort ist ein einfacher Sortieralgorithmus, der wiederholt benachbarte Elemente vergleicht und vertauscht, wenn sie in der falschen Reihenfolge stehen. Er hat eine Worst-Case-Laufzeit von O(n²).

9. Warum wird Bubblesort in der Praxis kaum verwendet?

Bubblesort wird in der Praxis kaum verwendet, weil seine Laufzeit von O(n²) bei großen Datenmengen sehr langsam ist. Er ist aber ein gutes Lernbeispiel, um Sortieralgorithmen zu verstehen.

10. Was ist Selection Sort?

Selection Sort sucht in jedem Durchgang das kleinste Element im unsortierten Bereich und setzt es an die nächste Position des sortierten Bereichs. Seine Laufzeit beträgt immer O(n²).

11. Was ist Insertion Sort?

Insertion Sort fügt jedes Element an der richtigen Stelle in den bereits sortierten Bereich ein. Er ist besonders effizient, wenn die Liste bereits fast sortiert ist, und hat im Best Case eine Laufzeit von O(n).

12. Was ist der Best Case von Insertion Sort?

Der Best Case von Insertion Sort ist O(n). Er tritt ein, wenn die Liste bereits sortiert ist, weil dann jedes Element nur einmal eingefügt werden muss ohne Verschiebungen.

13. Was bedeutet O(1)?

O(1) bedeutet konstante Laufzeit. Die benötigte Zeit ist unabhängig von der Größe der Eingabe. Ein Beispiel ist der Zugriff auf ein Array-Element über einen Index.

14. Was bedeutet O(n)?

O(n) bedeutet lineare Laufzeit. Die benötigte Zeit wächst proportional zur Eingabegröße. Bei doppelter Datenmenge dauert der Algorithmus etwa doppelt so lange.

15. Was bedeutet O(log n)?

O(log n) bedeutet logarithmische Laufzeit. Die Laufzeit wächst sehr langsam, weil der Problemraum in jedem Schritt verkleinert wird. Die binäre Suche ist ein typisches Beispiel.

16. Was bedeutet O(n²)?

O(n²) bedeutet quadratische Laufzeit. Die Laufzeit wächst quadratisch mit der Eingabegröße. Bei doppelter Datenmenge benötigt der Algorithmus etwa vier Mal so viel Zeit. Bubblesort und Selection Sort haben diese Laufzeit.

17. Was ist der Worst Case?

Der Worst Case beschreibt das ungünstigste Szenario für einen Algorithmus. Big-O-Notation gibt in der Regel den Worst Case an, damit Du die maximale Laufzeit abschätzen kannst.

Keine Sorge, einen Artikel über die Binäre Suche haben wir natürlich ebenfalls. Durch die FAQs kennst Du nun schon die Arbeitsweise.

18. Was ist der Best Case?

Der Best Case beschreibt das günstigste Szenario. Beispielsweise findet die lineare Suche ein Element sofort am Anfang der Liste und hat dann eine Laufzeit von O(1).

19. Was ist ein stabiler Sortieralgorithmus?

Ein Sortieralgorithmus ist stabil, wenn Elemente mit gleichem Wert ihre ursprüngliche Reihenfolge beibehalten. Insertion Sort ist stabil, Bubblesort kann stabil sein, Selection Sort ist in der Regel nicht stabil.

20. Was bedeutet In-Place-Sortierung?

Ein Sortieralgorithmus arbeitet in-place, wenn er nur konstanten zusätzlichen Speicherplatz benötigt und die Sortierung direkt in der ursprünglichen Liste vornimmt. Bubblesort, Selection Sort und Insertion Sort arbeiten in-place.

21. Welcher Suchalgorithmus ist der schnellste?

Bei sortierten Daten ist die binäre Suche mit O(log n) der schnellste der hier vorgestellten Suchalgorithmen. Bei unsortierten Daten bleibt die lineare Suche mit O(n) die einfachste Wahl.

22. Welcher Sortieralgorithmus ist der schnellste?

Unter den hier vorgestellten Algorithmen ist Insertion Sort im Best Case mit O(n) am schnellsten. Für große, zufällige Datenmengen sind jedoch Quicksort, Mergesort oder Heapsort mit O(n log n) deutlich besser.

23. Wann sollte man Bubblesort verwenden?

Bubblesort solltest Du praktisch nie in produktivem Code verwenden. Er ist ausschließlich zum Lernen und Verstehen von Sortieralgorithmen geeignet.

24. Kann man die binäre Suche auf verkettete Listen anwenden?

Die binäre Suche ist auf verkettete Listen nicht effizient, weil der Zugriff auf das mittlere Element O(n) erfordert. Sie ist optimal für Arrays und ähnliche Strukturen mit direktem Indexzugriff.

25. Welche Sortieralgorithmen sollte ich als Entwickler unbedingt kennen?

Jeder Entwickler sollte Bubblesort, Selection Sort, Insertion Sort, Quicksort, Mergesort und Heapsort kennen. Die einfachen Algorithmen helfen, Big-O und Grundprinzipien zu verstehen, die komplexeren sind für die Praxis wichtig.
Zurück zum DEV Blog
Share:

Ähnliche Beiträge