Counting Sort Workshop

Counting Sort in PHP - Workshop

Definition

Counting Sort ist ein nicht-vergleichsbasierter Sortieralgorithmus, der besonders effizient bei ganzen Zahlen mit kleinem Wertebereich ist. Er zählt, wie oft jedes Element vorkommt, berechnet daraus die Position und erstellt so ein sortiertes Array. Die Laufzeit beträgt O(n + k), wobei n die Anzahl der Elemente und k der Wertebereich ist.

Coutingsort PHP-Skript

Das folgende PHP-Skript zeigt die Funktionsweise von Counting Sort mit Syntax-Highlighting:


<?php
function countingsort($arr) {
    // Abbruch, wenn sich im Array ein nicht ganzzahliges oder negatives Element befindet
    foreach ($arr as $v) {
        if (!is_int($v) || $v < 0) {
            return false;
        }
    }

    // Höchsten Zahlenwert im Array ermitteln
    $max = max($arr);

    // Leeres Zählarray erstellen und mit Nullen füllen
    $count = array_fill(0, $max + 1, 0);

    // Zählvorgang: Für jede Zahl im Ursprungsarray Zähler erhöhen
    foreach ($arr as $value) {
        $count[$value]++;
    }

    // Sortiertes Array erstellen
    $sort = [];

    // Zahlen entsprechend ihrer Häufigkeit ins sortierte Array einfügen
    for ($i = 0; $i <= $max; $i++) {
        while ($count[$i] > 0) {
            $sort[] = $i;
            $count[$i]--;
        }
    }

    // Sortiertes Array zurückgeben
    return $sort;
}

// Beispielarray
$array = [9, 3, 5, 1, 0, 3, 7, 23];

// Sortierung aufrufen
$sortiert = countingsort($array);

// Ausgabe
if (is_array($sortiert)) {
    print_r($sortiert);
} else {
    echo "Sortierung fehlgeschlagen. Das Array darf keine negativen Zahlen und nur Ganzzahlen enthalten.";
}
?>
    

Allgemeine Erklärung von Counting Sort

Counting Sort ist ein einfacher, aber sehr effizienter Sortieralgorithmus für ganzzahlige Werte. Er funktioniert nicht wie andere Sortieralgorithmen durch Vergleiche, sondern indem er zählt, wie oft jede Zahl im Eingabearray vorkommt.

Wie funktioniert Counting Sort?

  1. Alle Zahlen im Eingabearray müssen nicht-negativ und ganzzahlig sein.
  2. Ein Hilfsarray (Zählarray) zählt, wie oft jede Zahl vorkommt.
  3. Danach wird das Ergebnisarray zusammengesetzt, indem die Zahlen entsprechend ihrer Häufigkeit wiederholt eingefügt werden.

Counting Sort ist besonders nützlich, wenn man eine große Anzahl von Werten mit kleinem Wertebereich sortieren möchte, z. B. Noten, Alter oder Punkte. Der Algorithmus ist in der Regel schneller als vergleichsbasierte Sortierverfahren wie Bubble Sort oder Insertion Sort, hat aber Einschränkungen bei Gleitkommazahlen oder sehr großen Wertebereichen.

Vorteile & Nachteile von Counting Sort

Vorteile:

Nachteile:

Kurz und Knapp - Ablauf auf einem Blick

Effizienz & Laufzeit von Counting Sort

Prüfe dich selbst!

Interaktive Aufgaben: Aufgaben folgen!

Counting Sort zählt, wie oft jedes Element vorkommt und nutzt diese Häufigkeiten, um die Positionen im Ergebnisarray zu bestimmen.

  1. Erstelle ein Zählarray: [0, 0, 2, 1, 1]
  2. Kumulieren: [0, 0, 2, 3, 4]
  3. Sortiert: [2, 2, 3, 4]

Das solltest du dir merken!

Wichtige Infos zu Counting Sort

Unterstützung von Negativen Zahlen

Das folgende PHP-Skript zeigt die Funktionsweise von Counting Sort mit Syntax-Highlighting: Damit der Countingsort-Algorithmus negative Zahlen untersützt, muss das Array „verschoben“ werden. Das Zählarray $count wird somit nicht mehr von 0 bis zum Maximalwert aufgebaut, sondern vom Minimalwert bis zum Maximalwert.


<?php
function countingsort($arr) {
    // Abbruch: Wenn ein Element keine ganze Zahl ist
    foreach ($arr as $v) {
        if (!is_int($v)) {
            return false;
        }
    }

    // Höchsten und niedrigsten Wert im Array finden
    $max = max($arr);
    $min = min($arr);

    // Spanne (Abstand zwischen min und max)
    $span = abs($max - $min);

    // Leeres Zählarray initialisieren
    $count = array_fill(0, $span + 1, 0);

    // Zählen: Häufigkeit jeder Zahl erfassen
    foreach ($arr as $value) {
        $count[$value - $min]++;
    }

    // Sortiertes Array erstellen
    $sort = [];

    for ($i = 0; $i < count($count); $i++) {
        while ($count[$i] > 0) {
            $sort[] = $i + $min;
            $count[$i]--;
        }
    }

    // Ergebnis zurückgeben
    return $sort;
}

// Beispielarray
$array = [9, 3, -4, 1, -43, 3, 7, 23];

// Sortierung aufrufen und ausgeben
$sortiert = countingsort($array);

if (is_array($sortiert)) {
    print_r($sortiert);
} else {
    echo "Sortierung fehlgeschlagen. Das Array darf nur Ganzzahlen enthalten.";
}

?>
    

Erklärung – Wie funktioniert das? Und wie werden negative Zahlen berücksichtigt?

Counting Sort funktioniert normalerweise nur mit nicht-negativen ganzzahligen Werten, da das Zählarray die Werte direkt als Index verwendet. Um negative Zahlen zu unterstützen, wird ein Offset eingebaut:

Schritt-für-Schritt:

  1. Prüfen auf Ganzzahlen:
    Der Code durchläuft alle Werte im Array und bricht ab, wenn ein Wert kein Integer ist (z. B. Float oder String).
  2. Minimal- und Maximalwert bestimmen:
    min($arr) und max($arr) finden den Wertebereich (inkl. negativer Werte).
  3. Zählarray anlegen:
    Normalerweise wäre das Zählarray so groß wie der größte Wert. Hier wird es auf die Spanne ($span) zwischen min und max ausgelegt.
  4. Offset verwenden:
    Weil negative Zahlen keine gültigen Array-Indizes sind, wird jeder Wert um -$min verschoben.

    Beispiel: Bei einem Wert von -43 und einem min = -43, wird $count[-43 - (-43)] = $count[0] erhöht.
  5. Sortiertes Array aufbauen:
    Die Werte werden entsprechend ihrer Häufigkeit in aufsteigender Reihenfolge wieder zusammengesetzt, wobei der Offset ($i + $min) zurückgerechnet wird.
  6. Ausgabe:
    Das fertige sortierte Array wird ausgegeben. Bei ungültigen Werten wird eine Fehlermeldung angezeigt.

Anmerkung zur Laufzeit: Die Laufzeit für die negative Unterstützung ändert sich nun zu O(n + ($max-$min)).

HTML-Code: Lade den HTML-Code dieser Seite als Datei herunter.

Quellen - (Weitere folgen)

GeeksforGeeks Countingsort
Wikipedia Countingsort

Anmerkung

Diese Website ist während einer praktischen Aufgabe im Informatik Unterricht in der 11. Klasse entstanden. Alle Quellen wurden zuvor angegeben und können nachvollzogen werden.

ImpressumDatenschutzinformation