Notierst Du Dir Ganze, hast Du im Grunde schon die Hälfte des Counting Sort Algorithmus durchgeführt. Wie Du die Liste nach dem Sortieralgorithmus jetzt noch sortieren kannst, erfährst Du in dieser Erklärung.
Counting Sort erklärt
Das Prinzip hinter Counting Sort ist es, Elemente mit unterschiedlichen Schlüsselwerten zu zählen und diese anschließend in einer sortierten Liste abzubilden. Wie das Ganze abläuft, findest Du anhand eines Beispiels nach der Definition erklärt.
Statt Counting Sort kannst Du auch Countingsort schreiben – beide Schreibweisen sind korrekt.
Counting Sort Definition
Counting Sort ist ein stabiler, nicht vergleichsbasierter Sortieralgorithmus, der Datenmengen mithilfe von Schlüsselwerten sortiert.
Beachte, dass es sich bei den zugeordneten Schlüsseln immer um natürliche Zahlen handeln muss. Falls Du Dich jetzt fragen solltest, ob Du mit Counting Sort nur Zahlen sortieren kannst – das ist nicht der Fall. Es ist auch möglich z. B. Adressen zu sortieren, indem Du ihnen eine Referenz in Form einer ganzen natürlichen Zahl zuweist, diese dann sortierst und später wieder entschlüsselst.
Eine Weiterentwicklung vom Counting Sort ist der Radix Sort. Mehr zu diesem Sortieralgorithmus findest Du in der gleichnamigen Erklärung auf StudySmarter.
Counting Sort Algorithmus
Am einfachsten lässt sich der Counting Sort Algorithmus durch ein Beispiel veranschaulichen. Gegeben ist folgendes Array:
1. Schritt: Zählen der Elemente
Im ersten Schritt werden ein Index und eine Hilfsarray angelegt. Der Index geht in diesem Fall von 0 bis 9, das Hilfsarray wird zunächst mit Nullen gefüllt.
Hilfsarray | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Anschließend zählst Du, wie oft die jeweiligen Zahlenwerte im gegebenen Array vorkommen und trägst diese Zahl im Hilfsarray ein.
Hilfsarray | 0 | 0 | 2 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Als kleine Kontrolle kannst Du die Werte aus dem Hilfsarray zusammenzählen. Die Zahl sollte gleich der Menge Deiner unsortierten Daten sein.
2. Schritt: Elemente aufsummieren
Summiere nun die Elemente des Hilfsarrays von links nach rechts auf – also addiere zu jedem Feld den Wert des linken Nachbarfelds. Du beginnst im Beispiel beim Index 1.
Was ist der Sinn des Ganzen: Durch diesen Schritt weißt Du nicht mehr nur wie oft einzelne Elemente vorkommen, sondern auch an welche Stelle sie gehören!
Hilfsarray | 0 | 0 | 2 | 3 | 4 | 5 | 5 | 6 | 7 | 8 |
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Mit diesem Schritt ist das Zählen abgeschlossen – nun können die Elemente sortiert werden.
3. Schritt: Elemente sortieren
Für das Einsortieren wird ein Zielarray angelegt. Der Platzhalter sagt aus, wie viele Elemente sortiert werden und dient einfach als Hilfe – in diesem Fall sind es die Zahlen 1 bis 8, da das gegebene Array acht Elemente enthält.
Zielarray | | | | | | | | |
Platzhalter | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Gehe jetzt durch Dein unsortiertes Array durch und schreibe das Element im Zielarray an die Position, die im Hilfsarray steht.
Das Array muss von rechts nach links durchlaufen werden, damit der Algorithmus stabil bleibt.
Unsortiertes Array | 5 | 2 | 8 | 4 | 9 | 7 | 2 | 3 |
Hilfsarray | 0 | 0 | 2 | 3 | 4 | 5 | 5 | 6 | 7 | 8 |
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Schaue Dir also zunächst den Index 3 an. Dort steht eine 3, also schreibst Du die 3 an die Stelle 3 in das Zielarray. Zusätzlich reduzierst Du den Wert im entsprechenden Hilfsarray um 1.
Hilfsarray | 0 | 0 | 2 | 2 | 4 | 5 | 5 | 6 | 7 | 8 |
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Zielarray | | | 3 | | | | | |
Platzhalter | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Als Nächstes kommt die 2 dran: Die 2 hat den Wert 2 und wird entsprechend an die zweite Stelle im Zielarray geschrieben. Verringere anschließend wieder den Wert im Hilfsarray um 1.
Hilfsarray | 0 | 0 | 1 | 2 | 4 | 5 | 5 | 6 | 7 | 8 |
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Zielarray | | 2 | 3 | | | | | |
Platzhalter | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Gehe das restliche Array nach dem gleichen Prinzip durch. Noch einmal interessant wird es bei der zweiten 2. Da Du den Wert im Hilfsarray vorhin um 1 reduziert hast, landet die zweite 2 nun an der Stelle 1 im Zielarray.
Hier wird auch noch mal deutlich, warum der Algorithmus das Array rückwärts durchlaufen muss, um stabil zu bleiben. Würdest Du das Array von links nach rechts durchgehen, landet die erste 2 an der Stelle 2 im Zielarray und die zweite 2 würde davor landen – das heißt ihre ursprüngliche Reihenfolge wäre vertauscht und der Algorithmus wäre instabil.
Hilfsarray | 0 | 0 | 0 | 2 | 3 | 5 | 5 | 5 | 6 | 7 |
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Zielarray | 2 | 2 | 3 | 4 | | 7 | 8 | 9 |
Platzhalter | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Führe den Algorithmus nun noch zu Ende durch.
Hilfsarray | 0 | 0 | 0 | 2 | 3 | 4 | 5 | 5 | 6 | 7 |
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Zielarray | 2 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
Platzhalter | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Fertig ist Dein mit Counting Sort sortiertes Array. Zugegeben, im Gegensatz zu vergleichsbasierten Sortieralgorithmen wie Selection Sort oder Bubble Sort, ist dieser nicht vergleichsbasierte Algorithmus etwas komplexer. Hast Du das Prinzip jedoch einmal verstanden, sollte Dir auch dieser Algorithmus keine Schwierigkeiten bereiten.
Kommt in einem Array jeder Schlüssel exakt einmal vor, benötigst Du übrigens keine Vergleiche, sondern kannst die Schlüssel einfach so übertragen.
Counting Sort Vorgehensweise
Noch einmal kurz zusammengefasst, wie geht Counting Sort vor:
- Übergebe das Eingabearray mit den zu sortierenden Daten
- Berechne das Maximum der Werte
- Lege basierend auf dem Maximum einen Index sowie ein Hilfsarray an, das zunächst mit Nullen initialisiert wird
- Zähle nun, wie oft jedes Element vorkommt und trage die Zahl ins Hilfsarray ein
- Summiere nun alle Elemente von links nach rechts auf
- Sortiere nun die Elemente, indem Du die unsortierte Datenmenge von rechts nach links durchläufst; lege dafür ein Zielarray an
- Schreibe dabei das Element im Zielarray an die Position, die im Hilfsarray angegeben ist
- Reduziere den Wert im Hilfsarray um 1
- Fahre fort, bis das komplette Array sortiert ist
Counting Sort Komplexität
Wie sieht es mit der Komplexität von Counting Sort aus? Auch hier können wieder die Zeitkomplexität (Laufzeit) und die Platzkomplexität (zusätzlicher Speicher) betrachtet werden.
Counting Sort Laufzeit
Die Counting Sort Laufzeit ist abhängig von der Anzahl der zu sortierenden Daten (n) und der Größe des Zahlenraums (k). Dabei enthält der Algorithmus meist eine – oder mehrere – Schleifen, um die Daten (n) zu durchlaufen und eine für die Größe des Zahlenraums (k).
Daraus ergibt sich wiederum eine Laufzeit von O(n + k), die sowohl für den Best-Case als auch für den Average-Case und den Worst-Case gilt.
Counting Sort Laufzeitanalyse
Aus der Laufzeitanalyse vom Counting Sort lassen sich verschiedene Aussagen ablesen. In der folgenden Tabelle findest Du diese getrennt nach vorsortierten und unsortierten Datenmengen.
Vorsortierte Datenmengen | Unsortierte Datenmengen |
Gemessene Werte entsprechen der erwarteten linearen Komplexität von O(n + k). | Gemessene Werte liegen etwas über einer linearen Komplexität. |
Bei sehr vielen Elementen (mehrere Millionen) werden vorsortierte Datenmengen etwa neunmal so schnell sortiert wie unsortierte Datenmengen. | |
Datenmengen, die absteigend vorsortiert sind, werden etwas langsamer sortiert als aufsteigend vorsortierte Daten. | |
Außerdem kann festgehalten werden, dass die Anzahl an benötigten Operationen nicht abhängig von der Reihenfolge der gegebenen Datenmenge ist. Zudem entspricht die Anzahl an Operationen der erwarteten Laufzeit von O(n + k).
Counting Sort Platzkomplexität
Counting Sort läuft out-of-place und benötigt neben einer Hilfsvariable ein temporäres Array als Zwischenspeicher. Deswegen beträgt die Platzkomplexität O(n + k).
Counting Sort – Weitere Begrifflichkeiten
Im Folgenden werden weitere Begrifflichkeiten rund um Counting Sort erklärt, dazu gehören:
- Stabilität
- Vergleichsbasiert
- Parallelisierbarkeit
Counting Sort stabil Beweis
Beim Counting Sort Algorithmus handelt es sich um ein stabiles Verfahren. Warum? Das liegt daran, dass gleiche Elemente beim Kopieren nicht vertauscht werden – das Array wird dafür immer von rechts nach links durchgearbeitet.
Counting Sort vergleichsbasiert
Counting Sort arbeitet im Gegensatz zu anderen Sortieralgorithmen wie Selection Sort oder Bubble Sort nicht vergleichsbasiert. Das heißt, es werden keine zwei Elemente miteinander verglichen, stattdessen wird eine Datenmenge gezählt und durch Schlüsselwerte sortiert.
Counting Sort Parallelisierbarkeit
Counting Sort ist ein parallelisierbarer Sortieralgorithmus. Das kannst Du erreichen, indem Du die gegebene Datenmenge in so viele Partitionen unterteilst, wie Deinem Rechner Prozessoren zur Verfügung stehen.
Wie läuft die Parallelisierung dann grob weiter ab? Im 1. Schritt durchläuft jeder Prozessor seine zugeteilten Elemente in einem Hilfsarray. Beim 2. Schritt werden dann alle Hilfsarrays zusammengenommen. Im letzten Schritt kopieren die Prozessoren "ihre" Elemente in das Zielarray.
Parallel durchgeführter Counting Sort ist nicht mehr stabil, da die ursprüngliche Reihenfolge von gleichen Elementen durch das Hin- und Herkopieren von unterschiedlichen Prozessoren nicht gewährleistet werden kann.
Counting Sort Zusammenfassung
In der folgenden Übersicht wird das bisher Gelernte noch einmal zusammengefasst:
Best-Case | Average-Case | Worst-Case | Platz-komplexität | Stabiles Verfahren | vergleichs-basiert | In-Place | Parallelisier-barkeit |
O(n + k) | O(n + k) | O(n + k) | O(n + k) | Ja | Nein | Nein | Möglich |
Counting Sort Beispiel
In den folgenden Abschnitten werden Dir noch ein paar weitere (Code-)Beispiele rund um Counting Sort vorgestellt. Doch zunächst soll noch geklärt werden, wann der Sortieralgorithmus am ehesten verwendet wird:
- Bei kleineren, häufiger vorkommenden Zahlen
- Wenn eine lineare Komplexität gefordert wird
Counting Sort Pseudocode
Pseudocode könnte beim Counting Sort Algorithmus wie folgt aussehen:
counting sort (A)
// A ist das zu sortierende Array
// Komplexität beträgt O(k)
for i = 0 to k
do C[i] = 0 // Initialisierung des Hilfsarrays mit der Zahl 0
// Zählen der Elemente + abspeichern
for j = 1 to length[A]
do C[A[j]] = C[A[j]] + 1
// berechnen der Summe, sodass C[i] die tatsächliche Position der Elemente im Ausgabearray enthält
for i = 1 to k
do C[i] = C[i] + C[i - 1]
// Ausgabearray aus C[i] erstellen durch neu ordnen/Sortieren der Elemente
for j = length[A] downto 1
do B[C[A[j]]] = A[j]
C[A[j]] = C[A[j]] - 1
end function
Counting Sort – Das Wichtigste
- Einfach erklärt ist Counting Sort ein stabiler, nicht vergleichsbasierter Sortieralgorithmus, der Datenmengen mithilfe von Schlüsselwerten sortiert.
- Counting Sort Algorithmus Vorgehensweise:
- Maximum eines Eingabearrays berechnen
- Index und Hilfsarray anlegen + Anzahl Elemente zählen und im Hilfsarray notieren
- Elemente von links nach rechts aufsummieren
- Ursprüngliche Datenmenge von rechts nach links durchgehen und das Element im Zielarray an die Position schreiben, die im Hilfsarray steht
- Danach den Wert im Hilfsarray um 1 reduzieren
- Counting Sort besitzt eine Laufzeit von O(n + K), die Platzkomplexität beträgt ebenfalls O(n + k).
- Counting Sort stabil Beweis: Counting Sort ist ein stabiles Verfahren, weil gleiche Elemente beim Sortieren nicht in ihrer ursprünglichen Reihenfolge vertauscht werden.
Wie stellen wir sicher, dass unser Content korrekt und vertrauenswürdig ist?
Bei StudySmarter haben wir eine Lernplattform geschaffen, die Millionen von Studierende unterstützt. Lerne die Menschen kennen, die hart daran arbeiten, Fakten basierten Content zu liefern und sicherzustellen, dass er überprüft wird.
Content-Erstellungsprozess:
Lily Hulatt ist Digital Content Specialist mit über drei Jahren Erfahrung in Content-Strategie und Curriculum-Design. Sie hat 2022 ihren Doktortitel in Englischer Literatur an der Durham University erhalten, dort auch im Fachbereich Englische Studien unterrichtet und an verschiedenen Veröffentlichungen mitgewirkt. Lily ist Expertin für Englische Literatur, Englische Sprache, Geschichte und Philosophie.
Lerne Lily
kennen
Content Quality Monitored by:
Gabriel Freitas ist AI Engineer mit solider Erfahrung in Softwareentwicklung, maschinellen Lernalgorithmen und generativer KI, einschließlich Anwendungen großer Sprachmodelle (LLMs). Er hat Elektrotechnik an der Universität von São Paulo studiert und macht aktuell seinen MSc in Computertechnik an der Universität von Campinas mit Schwerpunkt auf maschinellem Lernen. Gabriel hat einen starken Hintergrund in Software-Engineering und hat an Projekten zu Computer Vision, Embedded AI und LLM-Anwendungen gearbeitet.
Lerne Gabriel
kennen