Bitonic Mergesort, Variante 5 (2: Listen-Optimierung)

Hierbei handelt es sich um eine verbesserte Variante, die besonders für Listen geeignet ist. Die Idee ist einfach: Bei Listen sind Verschiebungen billiger als Vertauschungen. Außerdem werden weniger Bewegungsopterationen benötigt und das Verfahren ist dann nicht mehr out-of-place.

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

Variante 5.a (iterativ)
Typ optimiert
Eigenschaften iterativ, in-place, stabil, ???
Datenstrukturen einfachverkettete Listen (?)
Speicher Ω(1) Θ(1) Ο(1)
Laufzeit Ω(nlogn) Θ(nlogn) Ο(nlogn)
Vergleiche nlogn/2 n(logn-1.25) nlogn
Verschiebungen 0 nlogn/2.3 nlogn/2

mergesort(field A, int l, int r) {
  ...
}

merge(field A, int l, int r, bool asc) {
  if asc then {
    c:= +1;
  } else {
    swap(l, r);
    c:= -1;
  }
  while (l <> r) do {
    if (A[l] > A[r]) then {
      move(A[r], A[l]);
    }
    l:= l + c;
  } 
}


Bitonic Mergesort, Variante 2+5


Bitonic Mergesort, Variante 2+5