Selectsort, Variante 4 (Listen-Optimierung)

Hierbei handelt es sich um eine alternative Variante, die besonders für Listen geeignet ist. Auch hier ist die Idee einfach: Da bei Listen Verschiebungen billiger als Vertauschungen sind, wird der Algorithmus dem entsprechend angepaßt.

Analog zur Variante 1 kann nun ebenfalls eine entsprechende Variante 2 und 3 entwickelt werden.

Variante 4.a (iterativ)
Typ alternativ
Eigenschaften iterativ, in-place, instabil, nicht parallelisierbar
Datenstrukturen einfachverkettete Listen, Felder
Speicher Ω(1) Θ(1) Ο(1)
Laufzeit Ω(n²) Θ(n²) Ο(n²)
Vergleiche n²/2 n²/2 n²/2
Verschiebungen 0 n n

selectsort(field A, int l, int r) {
  for i:=r downto l+1 do {
    q:= l;
    for j:=l to i-1 do {
      if (A[j+1] > A[q]) then {
        q:= j+1;
      }
    }
    move(A[q], A[i]);
  }
}

Variante 4.b (rekursiv)
Typ alternativ
Eigenschaften rekursiv, in-place, instabil, nicht parallelisierbar
Datenstrukturen einfachverkettete Listen, Felder
Speicher Ω(n) Θ(n) Ο(n)
Laufzeit Ω(n²) Θ(n²) Ο(n²)
Vergleiche n²/2 n²/2 n²/2
Verschiebungen 0 n n

selectsort(field A, int l, int r) {
  if (l < r) then {
    q:= max(A, l, l+1, r);
    move(A[q], A[r]);
    selectsort(A, l, r-1);
  }
}

int max(field A, int q, int l, int r) {
  if (l <= r) then {
    if (A[l] > A[q]) then {
      q:= l;
    }
    return max(A, q, l+1, r);
  } else {
    return q;
  }
}


Selectsort, Variante 4