Plaselsort, Variante 2 (ohne Dublikate)

Hierbei handelt es sich um eine vereinfachte Variante. Die Idee ist einfach: Der Algorithmus kann stark vereinfacht werden, wenn alle Elemente eindeutig platziert werden können, d.h. es gilt immer (A[i] <> A[j]) für alle i <> j.

(*) Analog zur Variante 2 von Selectsort kann hier eine Alternative zur Zählung der kleineren Elemente entwickelt werden, die dann parallelisierbar wäre.

Variante 2.a (iterativ)
Typ vereinfacht
Eigenschaften iterativ, in-place, instabil, parallelisierbar
Datenstrukturen Felder, einfachverkettete Listen
Speicher Ω(1) Θ(1) Ο(1)
Laufzeit (p) Ω(nlogn) Θ(nlogn) Ο(nlogn)
Laufzeit Ω(n²) Θ(n²) Ο(n²)
Vergleiche n²/2 1.5*n² 2*n²
Vertauschungen 0 n n

plaselsort(field A, int l, int r) {
  for i:= l to r-1 do {
    q:= i;                       // (*)
    for j:=i+1 to r do {         // (*)
      if (A[j] < A[i]) then {    // (*)
        q++;                     // (*)
      }                          // (*)
    }                            // (*)
    exchange(A[i], A[q]);
    if (q > i) then { i--; }
  }
}


Variante 2.b (rekursiv)
Typ vereinfacht
Eigenschaften rekursiv, in-place, instabil, nicht parallelisierbar
Datenstrukturen Felder, einfachverkettete Listen
Speicher Ω(n) Θ(n) Ο(n)
Laufzeit (p) Ω(nlogn) Θ(nlogn) Ο(nlogn)
Laufzeit Ω(n²) Θ(n²) Ο(n²)
Vergleiche n²/2 1.5*n² 2*n²
Vertauschungen 0 n n

plaselsort(field A, int l, int r) {
  if (l < r)  then {
    q:= l + plasel(A, l, l+1, r);
    exchange(A[l], A[q]);
    if (q = l) then { l++; }
    plaselsort(A, l, r);
  }
}

plasel(field A, int p, int l, int r) { // (*)
  if (l <= r) then {                   // (*)
    q:= plasel(A, p, l+1, r);          // (*)
    if (A[l] < A[p]) then {            // (*)
      q++;                             // (*)
    }                                  // (*)
    return q;                          // (*)
  } else {                             // (*)
    return 0;                          // (*)
  }                                    // (*)
}                                      // (*)


Plaselsort, Variante 2