Bsort, Variante 3 (Tepif)

Hierbei handelt es sich um eine alternative Variante. Die Idee ist einfach: Ein temporäres Indexfeld (bidirektional) spart Speicherplatz, Kenntnisse über die Elemente und reduziert das Risiko eines Datenverlustes (da in-place).

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

Variante 3.a (halbrekursiv)
Typ alternativ
Eigenschaften halbrekursiv, in-place, stabil, nicht parallelisierbar
Datenstrukturen Felder, einfachverkettete Listen
Speicher Ω(n) Θ(n) Ο(n)
Laufzeit Ω(nlogn) Θ(nlogn) Ο(nlogn)
Vergleiche n(logn-2) 1.1n(logn-2) 1.5n(logn-2)
Vertauschungen 0 n n

bsort(field A, int l, int r) {
  root:= null;
  for i:= r downto l do {
    top:= insert(A, root, new node_element(i));
    if (top <> null) {
      root:= new node_head(1, root, top);
    }
  }
  for i:= l to r do {
    B[0][i] = i;
    B[1][i] = i;
  }
  resolve(A, B, l, root);
}

node_element insert(field A, node_head head, node_element e) {
  ...
}

int resolve(field A, int[][] B, int index, node_head head) {
  if (head <> null) then {
    current:= head;
    while (current <> null) do {
      index:= resolve(A, B, index, current.child);
      if (current.next <> null) then {
        s:= B[0][current.next.index];
        t:= B[1][index];
        exchange(A[s], A[index]);
        B[0][t]:= s;
        B[1][s]:= t;
        index++;
      }
      current:= current.next;
    }
  }
  return index;
}


node find_ge(field A, node_head head, node_element e) {
  ...
}

node find_n(node_head head, int i) {
  ...
}

node_element split(node_head head) {
  ...
}

private abstract class node {
  ...
}

protected class node_element extends node {
  ...
}

protected class node_head extends node {
  ...
}


Bsort, Variante 3