Implementierung

Ausgehend von den oben genannten Bedingungen gestalltet sich die Implementierung sehr einfach. Die data variable ist die Adresse des Originalarrays, welches zu sortieren ist. Nach dem das größte Element ausfindig gemacht wurde, werden die zwei temporären Arrays mit Hilfe der Funktion ``malloc'' erstellt. Natürlich sollte man ernsthaft den Rückgabewert dieser Funktion auf NULL überprüfen; dies geschieht in der hier gezeigten Funktion der übersichtlichkeithalber nicht. Alle Felder des count-arrays werden dann auf 0 initializiert. Darauf folgt das erfaßen der Häufigkeiten und letztlich das Aufsummieren. Anschliesend folgt die Sortierung, wobei ihr Ergebnis in das tmp-array gespeichert wird. Dieses Array wird eins zu eins in das Originalfeld zurückkopiert, worauf die Funktion, nach dem sie noch die zwei temporären Felder frei gegeben hat, zum Aufrufer zurückkehrt und der Algorithmus terminiert.


\begin{listing}{1}
void counting_sort( int * data, int N )
{
int k, i, max;
in...
... < N; i++ )
data[i] = tmp[i];
\par free( counts );
free( tmp );
}\end{listing}

Wie schon erwähnt, kann man für Datenmengen, die nur aus ganzen positiven Zahlen bestehen, eine andere Vorgehensweise des CountingSorts implementieren. Nach dem die Häufigkeitsinformation gesammelt wurde, lässt sich ohne das Aufsummieren und Schreiben eines Temporärarrays tmp arbeiten. Das letztere fällt gänzlich weg. Der Clue hier ist, daß die Indizes selbst als Elemente benutz werden, da die Elemente selbst Zahlen sind.


\begin{listing}{1}
num_counting_sort( int * data, int N )
{
int i, j, max;
int...
... {
data[i++] = j;
counts[j]--;
}
j++;
}
\par free( counts );
}\end{listing}

Angemerkt sei, daß in den beiden hier vorgestellten Implementierungen keine Überprüfung des Rückgabewertes der Funktion ``malloc'' stattfindet. Dies sollte in einer ernsthaften Verwendung des Algorithmus geschen, da diese Funktion durchaus fehlschlagen kann und in diesem Falle ``NULL'' liefert, um so einen Fehler zu signalisieren.


Nächste Seite  Aufwärts  Vorherige Seite  Inhalt 


Nächste Seite: Optimierung Aufwärts: CoutingSort Vorherige Seite: Laufzeitkomplexität   Inhalt

2002-05-09