WikiDer > Zählen sortieren
Zählen sortieren, manchmal auch count-sort genannt, ist ein extrem einfaches Sortieralgorithmus, die nur für ganze Zahlen und ähnliche Objekte verwendet werden kann. Gerade wegen der begrenzten Anwendungsmöglichkeiten kann es eine sehr effiziente Art der Sortierung sein. Voraussetzung dafür ist, dass der kleinste und größte vorkommende Wert bekannt ist und die zu sortierenden Zahlen in einem relativ kleinen Bereich liegen.
Operation
Wenn die kleinsten und größten Werte nicht bekannt sind, müssen sie vor der Sortierung bestimmt werden. Das Komplexitätsgrad dieses Algorithmus ist O(n k), wobei k der größte vorkommende Wert ist. Ein Nachteil dieses Algorithmus ist, dass er sehr speicherintensiv ist.
Ein Beispiel: Die unsortierte Menge von ganzen Zahlen ist 6, 4, 6, 8, 9, 6, 4, 9, 5, 7, 5, 5, 8, 5. Die kleinste Zahl ist 4 und die größte ist 9. Basierend auf von jedem Element zwischen 4 und 9 wird gezählt, wie oft es in der Reihe vorkommt. Getorftes Ergebnis:
4: ||
5: ||||
6: |||
7: |
8: ||
9: ||
Die Ergebnisse der Zählung werden erneut sequenziert und die Sortierung ist abgeschlossen: 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9.
Beispielimplementierungen
C
Eine Umsetzung in C : countingsort-Funktion sortiert die Liste der ganzen Zahlen aiIn mit Anzahl von Elementen nInItems nach dem Zähl-Sortier-Algorithmus:
LeereZählen sortieren(intaiIn[],intnInItems){/* Bestimme die höchste und die niedrigste */intiLo=MAXINT;intiHi=-MAXINT;zum(intich=0;ich<nInItems;ich){iLo=Mindest(aiIn[ich],iLo);iHi=max(aiIn[ich],iHi);}/* Erstellen Sie eine passende Revierliste, beginnen Sie mit 0 für jede Zahl */intnTurfItems=1iHi-iLo;intaiTurf[nTurfItems];zum(intja=0;ja<nTurfItems;ja){aiTurf[ja]=0;}/* zählen */zum(intich=0;ich<nInItems;ich){aiTurf[aiIn[ich]-iLo];// addiere 1 für die Zahl in Position i}/* durch Torfliste scrollen und runterzählen, wir verwenden die gegebene Liste für die Antwort wieder */intich=0;zum(intja=0;ja<nTurfItems;ja){während(aiTurf[ja]>0){aiIn[ich]=iLoja;aiTurf[ja]--;}}/* aiIn enthält jetzt die Zahlen in der richtigen Reihenfolge */}Java
Eine Umsetzung in Java: die countingsort-Funktion sortiert das Array "data" mit der "length"-Anzahl der Elemente nach dem counting-sort-Algorithmus:
// "data" ist das Array, das sortiert wird, dieses Array enthält die Anzahl der Elemente "length"ÖffentlichkeitLeereZählen sortieren(intTermine[],intLänge){intich,ja,k=0,kleinste,größte;// finde das kleinste und das größtekleinste=größte=Termine[0];zum(ich=1;ich<Länge;ich)wenn(Termine[ich]<kleinste)kleinste=Termine[ich];sonstwenn(Termine[ich]>größte)größte=Termine[ich];int[]übereinstimmen=Neuint[größte-kleinste1];// zählarray erstellen(zum=0;ich<(ich-größte1);kleinste)ich[übereinstimmen]=0;ich// starte alle zählung bei null(zum=0;ich<ich;Länge)ich[übereinstimmen[Termine]-ich] ;kleinste// auszählen// Daten sortieren (setzen Sie Torf "i" "j"x an Stelle "k")(zum=ich;kleinste<=ich;größte)ich(zum=ja[übereinstimmen-ich];kleinste>0;ja--){ja[Termine]=k;ich;}}k
C#
Als Beispiel eine Konsolenanwendung: Eine Häufigkeitstabelle dient zum Sortieren der Werte. (der Index der Häufigkeitstabelle = der Wert der Zahl, die Sie sortieren möchten, erhöhen Sie diesen um 1).
Wenn sortiert, zeigen Sie die Indizes der Häufigkeitstabelle an (entsprechend der Häufigkeit des Auftretens)mit;SystemKlasse{ProgrammstatischLeere(Main[]Schnur){argsBerechnungen=BerNeu();Berechnungen// Referenz auf Berechnungsklasse setzen[]int={2,1,3,22,8,5,6,7,84,2,4,5,6,9,8,5,9,60};TabelleMitZahlen// die zu sortierenden Zahlen (hier zufällig gewählt)int=Max.Ber(LengthOfFrequencyTable)1;TabelleMitZahlen// Größe der Häufigkeitstabelle bestimmen (kann auch manuell ausgewählt werden)[]int=HäufigkeitstabelleNeu[int];Max// ftab erstellen (= Häufigkeitstabelle).Ber(HäufigkeitstabelleFüllen,TabelleMitZahlen);Häufigkeitstabelle// die Methode ausführen (siehe unten)(zumint=0;ich<ich;Max )ich{// die Zahlen anzeigen the// der Wert des Index, ist die Häufigkeit, mit der die Indexnummer selbst vorkommt(zumint=J[Häufigkeitstabelle];ich>0;J--){J.Konsole(schreiben" ");}}ich.Konsole();}Schlüssel einlesen}/*Main*//*Programm*/Klasse{BerechnungenÖffentlichkeitint(LengthOfFrequencyTable[]int)Zahlen{// Berechne die höchste Zahl in tableWithNumbers (= Länge von ftab)int=Max[0];Zahlen(zumint=0;z<z.Zahlen;Länge ){z(wenn[Zahlen]>z){Max=Max[Zahlen];}}zRückkehr;}Max/*lengthOfX*/ÖffentlichkeitLeere(HäufigkeitstabelleFüllen[]int,TabelleMitZahlen[]int)Häufigkeitstabelle{// eine Zahl kommt in tableWithNumbers gleichzeitig vor// erhöht den Index um dieselbe Zahl von ftab(zumint=0;ich<ich.TabelleMitZahlen;Länge )ich{// zB: wenn Nummer 3 in tableWithNumbers vorkommt// dann wird der Index 3 in ftab um 1 erhöht[Häufigkeitstabelle[TabelleMitZahlen]] =1;}}ich}/*FtabFill*/