Countingsort, Variante 2 (Tepif)

Hierbei handelt es sich um eine alternative verbesserte Variante. Die Idee ist einfach: Ein temporäres Indexfeld mach aus jedem "out-of-place"-Verfahren ein "in-place"-Verfahren.

Eine rekursive Realisierung (Variante 2.b) ist möglich.

Variante 2.a (iterativ)
Typ alternativ, optimiert
Eigenschaften iterativ, in-place, stabil, (parallelisierbar)
Datenstrukturen Felder, doppeltverkettete Listen
Speicher Ω(n) Θ(n) Ο(n)
Laufzeit Ω(n+k) Θ(n+k) Ο(n+k)
Interpretationen 2n 2n 2n
Vertauschungen n n n

countingsort(field A, int l, int r, int k) {
  for i:= 0 to k-1 do parallel {
    C[i]:= 0;
  }
  for i:= l to r do {
    C[A[i]]++;
    B[0][i]:= i;
    B[1][i]:= i;
  }
  for i:=1 to k-1 do {
    C[i]:= C[i]+C[i-1];
  }
  for i:=l to r do {
    s:= B[0][i];
    j:= C[A[s]]-1+l;
    t:= B[1][j];
    exchange(A[s], A[j]);
    B[0][t]:= s;
    B[1][s]:= t;
    C[A[j]]--;
  }
}


Countingsort, Variante 2