(* minimum: Hilfsfunktion
gibt das kleinste Element der Liste zurück
bzw. x, falls x kleiner ist als alle Listenelemente. *)
fun minimum x nil = x
| minimum x (y::yl) =
if (x < y)
then minimum x yl
else minimum y yl;
(* delete: Hilfsfunktion
löscht x aus gegebener Liste. *)
fun delete x nil = nil
| delete x (y::yl) =
if (x = y)
then yl
else y :: delete x yl;
(* selectionsort: klar!
min: das kleinste Element der Liste xl.
rest: die Liste xl ohne min *)
fun selectionsort nil = nil
| selectionsort (x::xl) =
let
val min = minimum x xl;
val rest = delete min (x::xl);
in
min :: (selectionsort rest)
end;
(* Anwendungsbeispiel *)
val output1 = selectionsort [3, 6, 2, 9, 1, 8, 7, 4, 5];
val output2 = selectionsort [7, 7, 7, 2, 7, 2, 2, 2];
val output3 = selectionsort [~3, 3, ~2, 2];
(* Ausgabe:
val output1 = [1,2,3,4,5,6,7,8,9] : int list
val output2 = [2,2,2,2,7,7,7,7] : int list
val output3 = [~3,~2,2,3] : int list *)
Folgendes Implementierungsbeispiel in Delphi demonstriert ein In-Placement-Verfahren des SelectionSort.
unit USelectionSort;
interface
procedure SelectionSort(var A: array of Integer);
implementation
procedure SelectionSort(var A: array of Integer);
procedure Swap(var X, Y: Integer);
var
Swp: Integer;
begin
Swp := X;
X := Y;
Y := Swp;
end;
var
I, J: Integer;
begin
(* Nach dem ersten Durchgang ist Low(A) der Index des kleinsten Elements.
An die I-te Position wird nach und nach das kleinste Element (Minimum)
des unsortierten Rests geswappt. *)
for I := Low(A) to High(A) - 1 do
for J := I + 1 to High(A) do // der unsortierte Rest
if A[I] > A[J] then Swap(A[I], A[J]);
end;
end.