Shearsort, Variante 1 (Original)

Hierbei handelt es sich um die Original-Variante.

Die Wurzel aus "r-l+1" muß ganzzahlig sein, damit die Laufzeitabschätzung (average case) zutrifft!

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

Variante 1.a (iterativ)
Typ standard
Eigenschaften iterativ, in-place, instabil, parallelisierbar
Datenstrukturen Felder
Speicher Ω(1) Θ(1) Ο(1)
Laufzeit (p) Ω(n1/2logn) Θ(n1/2logn) Ο(n)
Laufzeit Ω(n3/2logn) Θ(n3/2logn) Ο(n²)
Vergleiche n3/2logn/2 n3/2logn/2 n²/2
Vertauschungen n/4 n3/2logn/6 n²/2

shearsort(field A, int l, int r) {
  rows:= Round(Down, Math.sqrt(r-l+1));
  while (rows > 1) and (((r-l+1) mod rows) <> 0) do {
    rows--;
  }
  cols:= (r-l+1)/rows;

  for k:= Round(Up, log(rows)) downto 1 do {
    for j:= 1 to cols do {
      for i:= l to r step cols do parallel {
        oet(A, i+(j mod 2), i+cols-1, 1, ((((i-l)/cols) mod 2) = 0));
      }
    }
    for j:= 1 to rows do {
      for i:= l to l+cols-1 do parallel {
        oet(A, i+(j mod 2)*cols, r-l-cols+i+1, cols, true);
      }
    }
  }
  for j:= 1 to cols do {
    for i:= l to r step cols do parallel {
      oet(A, i+(j mod 2), i+cols-1, 1, true);
    }
  }
}

oet(ifield A, int l, int r, int gap, boolean asc) {
  for i:= l to r-gap step 2*gap do parallel {
    if ((A[i] > A[i+gap]) == asc) {
      exchange(A[i], A[i+gap]);
    }
  }
}


Shearsort, Variante 1