SelectionSort

Ein recht ineffizienter Sortieralgorithmus ist der SelectionSort!
Sortieren

Einführung

Definition

Die Idee beim SelectionSort ist ganz einfach: Man suche in der Eingabesequenz A das kleinste Element m und setze es vorne vor die sortierte Restsequenz.

Die eigentliche Arbeit steckt hier in den Hilfsfunktionen. [FUNPROG]

Dieses Sortierverfahren wird auch als MinSort bezeichnet, da hier stets nach dem kleinsten Element (Minimum) der jeweiligen Restliste gesucht wird.

Komplexität

Der Aufwand dieser Funktion ist — bei einer Liste von n Elementen — quadratisch, also in der Größenordnung O(n²), weil jedes Element der Liste betrachtet wird und bei der Minimumsuche jedesmal die ganze (Rest-) Liste abgearbeitet werden muss. [FUNPROG]

Beispiel: Sortieren von Spielkarten

Bei Kartenspielen, bei denen die Karten zunächst aufgedeckt auf dem Tisch liegen können: Der Spieler nimmt die jeweils niedrigste der auf dem Tisch verbliebenen Karten auf und kann sie in der Hand links (oder rechts) an die bereits aufgenommenen Karten anfügen. Dieser Algorithmus wird SelectionSort genannt. [INFO2002]

Konkretes Zahlenbeispiel

Dabei sei nun [8,2,5,3,9,1,6,7,4] die zu sortierende Liste:
  1. [8,2,5,3,9,1,6,7,4][]
  2. [8,2,5,3,9,6,7,4][1]
  3. [8,5,3,9,6,7,4][1,2]
  4. [8,5,9,6,7,4][1,2,3]
  5. [8,5,9,6,7][1,2,3,4]
  6. [8,9,6,7][1,2,3,4,5]
  7. [8,9,7][1,2,3,4,5,6]
  8. [8,9][1,2,3,4,5,6,7]
  9. [9][1,2,3,4,5,6,7,8]
  10. [][1,2,3,4,5,6,7,8,9]

Implementierung

Implementierung mit SML

(* 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 (< 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 (= 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.

Implementierung mit Delphi

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.

Seiteninfo

Copyright © 2004-2008 Stefan K. Baur
Letzte Änderung:Sonntag, den 15. März 2009
Generierungszeitpunkt:Mittwoch, den 8. September 2010 um 3:57 Uhr

Domain:

www.stefan-baur.de
Pfad:Startseite Informatik Algorithmen Sortieren SelectionSort

Literatur

[FUNPROG]
Prof. Dr. Peter Pepper (TU Berlin): Funktionale Programmierung, Springer-Verlag, 1999, ISBN 3-540-64541-1.
In OPAL, ML, HASKELL und GOFER mit 34 Abbildungen
[INFO2002]
Heinz-Peter Gumm, Manfred Sommer: Einführung in die Informatik, Oldenbourg Verlag, Auflage 5, 2002, ISBN 3-486-25635-1
Sortieren Symbole Designs