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.
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.";
}
?>
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.
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.
O(n + k)
O(n + k)
O(n + k)
O(n + k)
Dabei ist:
n
= Anzahl der Elemente im Eingabearray
k
= Wertebereich (z. B. max - min)
Counting Sort zählt, wie oft jedes Element vorkommt und nutzt diese Häufigkeiten, um die Positionen im Ergebnisarray zu bestimmen.
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.";
}
?>
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:
min($arr)
und max($arr)
finden den Wertebereich (inkl. negativer Werte).$span
) zwischen min und max ausgelegt.-$min
verschoben.-43
und einem min = -43
, wird $count[-43 - (-43)] = $count[0]
erhöht.$i + $min
) zurückgerechnet wird.Anmerkung zur Laufzeit: Die Laufzeit für die negative Unterstützung ändert sich nun zu O(n + ($max-$min)).
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.