Ich würde sogar noch weiter gehen, und eine Hashmap verwenden.
Hier ist eine.
Eine binäre Suche dauert doch etwas, wenn auch nicht viel, aber der Suchaufwand nimmt mit der Größe der Liste doch zu. Das passiert bei einer Hashmap nicht. Die Hashmap wächst dynamisch.
Bei der o.g. Hashmap (TIntegerDictionary) wird zu jedem 4-Byte Schlüssel eine Nutzerinformation (Pointer) gespeichert. So würde die Zählfunktion aussehen:
Delphi-Quellcode:
Procedure Count (aDict : TIntegerDictionary; aCardinal : TCardinal);
Var
cnt : PInteger;
Begin
If aDict.Find (aCardinal, Cnt) Then // Wenn schon in der dictionary
Cnt^ := Cnt^ + 1 // ... Zähler erhöhen
Else Begin
new (Cnt); // Ansonsten neuen Zähler anlegen
Cnt^:= 1; // Initalisieren
aDict.Add (aCardinal, Cnt); // und ab in die dictionary
End
End;
Das geht -wie schon erwähnt- sehr schnell, schneller gehts eigentlich nicht (ok, eine Skiplistei ist marginal schneller, wenn sie nicht zu groß wird).
Klitzekleiner Pferdefuß: Die Ergebnisse sind unsortiert, du musst sie am Schluss auslesen, in eine Liste packen und diese dann sortieren, aber das hättest Du bei einer Liste ja auch.