Combsort, Variante 3 (Parallelisierung)

Hierbei handelt es sich um eine alternative Variante, die deutlich besser parallelisiert werden kann. Dazu nehme man intern nicht Ripplesort, sondern Oetsort.

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

Dieser Algorithmus (diese Variante) liefert die beste parallele Laufzeit!

Variante 3.a (iterativ)
Typ alternativ, optimiert
Eigenschaften iterativ, in-place, instabil, parallelisierbar
Datenstrukturen Felder
Speicher Ω(1) Θ(1) Ο(1)
Laufzeit (p) Ω(logn) Θ(logn) Ο(logn)
Laufzeit Ω(nlogn) Θ(n(logn)1.4) Ο(???)
Vergleiche 2.64*nlogn n(logn)1.4/1.17 ???
Vertauschungen 0 n(logn)1.3/4.57 ???

combsort(field A, int l, int r) {
  gap:= r-l;
  do {
    if (gap > 1) then {
      gap:= Round(Down, gap/1.3);
      if ((gap = 9) or (gap = 10)) then {
        gap:= 11;
      }
    }
  } while ((comb(A, l, r, gap)) or (gap > 1));
}

boolean comb(field A, int l, int r, int gap) {
  oet(A, l, r, gap);
  return oet(A, l+gap, r, gap);
}

boolean oet(field A, int l, int r, int gap) {
  flipped:= false;
  for i:= l to r-gap step 2*gap do parallel {
    for j:= i to ((i+gap-1) or (r-gap)) do parallel {
      if (A[j] > A[j+gap]) then {
        exchange(A[j], A[j+gap]);
        flipped = true;
      }
    }
  }
  return flipped;
}


Combsort, Variante 3