Selection-sort: Unterschied zwischen den Versionen
Thomas (Diskussion | Beiträge) Die Seite wurde neu angelegt: „== Einführung == Ein simpler Sortieralgorithmus ist der Selection Sort. Dieser Algorithmus sucht sich als erstes das kleinste Element in der Liste, merkt es sich und tauscht es gegen das Element am Anfang aus, sodass sich dann das kleinste Element ganz am Anfang befindet. Als Nächstes wird das zweitkleinste Element in der Liste gesucht und wird gegen das an zweiter Stelle platzierte Element der Liste ausgetauscht usw. Auf diese Weise haben immer die Ele…“ |
Keine Bearbeitungszusammenfassung |
||
| (2 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
== Einführung == | == Einführung == | ||
Ein | Ein einfacher [[Sortieren|Sortieralgorithmus]] ist der Selection Sort. Dieser Algorithmus sucht zunächst das kleinste Element in der Liste, merkt es sich und tauscht es mit dem Element am Anfang aus, sodass sich das kleinste Element an erster Stelle befindet. Anschließend wird das zweitkleinste Element gesucht und mit dem Element an zweiter Stelle vertauscht usw. Auf diese Weise erhalten die Elemente auf der linken Seite der aktuellen Position schrittweise ihren festen Platz und werden nicht mehr verändert. | ||
== Beispiel == | == Beispiel == | ||
[[Datei:Array Selectionsort.gif|mini]] | [[Datei:Array Selectionsort.gif|mini]] | ||
Es soll eine Liste mit dem Inhalt [4|3|1|5|2] sortiert werden. | Es soll eine Liste mit dem Inhalt [4|3|1|5|2] sortiert werden. | ||
Im ersten Durchlauf wird die komplette Liste | |||
Im ersten Durchlauf wird die komplette Liste durchsucht, um das kleinste Element auszuwählen (Select) und an den Beginn der Liste zu stellen. In diesem Beispiel ist das der Wert 1. Der ursprüngliche Wert der Startposition (hier 4) wird mit dem Wert an der Position des kleinsten Elements (hier 1 an Index 2) vertauscht. | |||
[[Datei:Animation Selectionsort.gif|mini]] | [[Datei:Animation Selectionsort.gif|mini]] | ||
Im zweiten Durchlauf beginnt die Suche nach dem kleinsten Element nun | Im zweiten Durchlauf beginnt die Suche nach dem kleinsten Element nun bei Index 1. An Index 0 befindet sich bereits das kleinste Element, daher ist dort keine Suche mehr erforderlich. Der restliche Teil der Liste wird durchsucht. Das kleinste Element befindet sich hier am Ende der Liste. Es wird die 2 als kleinstes Element ausgewählt und mit der neuen Startposition vertauscht. | ||
Die Suche wiederholt sich nach | Die Suche wiederholt sich nach diesem Prinzip, bis alle Elemente sortiert sind. Der Suchbereich verkleinert sich Schritt für Schritt. Die folgende Animation visualisiert den Algorithmus. | ||
== | == Pseudocode == | ||
Der Algorithmus sieht im Pseudocode so aus: | Der Algorithmus sieht im Pseudocode so aus: | ||
<syntaxhighlight> | |||
prozedur | <syntaxhighlight lang="text"> | ||
prozedur selectionSort(A ist Liste sortierbarer Elemente) | |||
n = Länge von A | |||
für einfuegeIndex von 0 bis n - 2 wiederhole | |||
minPosition = einfuegeIndex | |||
für idx von einfuegeIndex + 1 bis n - 1 wiederhole | |||
falls A[idx] < A[minPosition] dann | |||
minPosition = idx | |||
ende falls | |||
ende für | |||
falls minPosition ≠ einfuegeIndex dann | |||
vertausche A[minPosition] und A[einfuegeIndex] | |||
ende falls | |||
ende für | ende für | ||
ende prozedur | |||
</syntaxhighlight> | |||
== Java-Implementierung == | |||
<syntaxhighlight lang="java"> | |||
public ArrayList<Mitarbeiter> sortierenNachNachnamen() { | |||
ArrayList<Mitarbeiter> sortierteListe = new ArrayList<>(mitarbeiterListe); | |||
int stelle = 0; | |||
while (stelle < sortierteListe.size() - 1) { | |||
int kleinstesElement = stelle; | |||
if(sortierteListe.get(index).getNachname().compareTo(sortierteListe.get(kleinstesElement).getNachname()) < 0){ | for (int index = stelle + 1; index < sortierteListe.size(); index++) { | ||
if (sortierteListe.get(index).getNachname() | |||
.compareTo(sortierteListe.get(kleinstesElement).getNachname()) < 0) { | |||
kleinstesElement = index; | |||
} | } | ||
} | |||
if (kleinstesElement != stelle) { | |||
Mitarbeiter puffer = sortierteListe.get(kleinstesElement); | Mitarbeiter puffer = sortierteListe.get(kleinstesElement); | ||
sortierteListe.set(kleinstesElement,sortierteListe.get(stelle)) ; | sortierteListe.set(kleinstesElement, sortierteListe.get(stelle)); | ||
sortierteListe.set(stelle,puffer) | sortierteListe.set(stelle, puffer); | ||
} | } | ||
return sortierteListe; | |||
stelle++; | |||
} | |||
return sortierteListe; | |||
} | } | ||
</syntaxhighlight> | |||
== Komplexität == | == Komplexität == | ||
Mit Hilfe der [[Laufzeitanalyse]] betrachten wir nun die Zeitkomplexität des [[Algorithmus]] SelectionSort. | Mit Hilfe der [[Laufzeitanalyse]] betrachten wir nun die Zeitkomplexität des [[Algorithmus]] SelectionSort. | ||
Um eine Datenstruktur | Um eine Datenstruktur (z. B. ein [[Array]]) mit n Einträgen mittels SelectionSort zu sortieren, muss n−1-mal das Minimum durch Vergleichen bestimmt werden. Bei der ersten Bestimmung des Minimums sind n−1 Vergleiche notwendig, bei der zweiten n−2 Vergleiche usw. Mit der [[Arithmetische-reihe|gaußschen Summenformel]] erhält man die Gesamtanzahl der notwendigen Vergleiche: | ||
(n − 1) + (n − 2) + … + 1 = n(n − 1) / 2 | |||
SelectionSort liegt somit in der Komplexitätsklasse <math>O(n^2)</math>. | |||
[[Kategorie:Programmierung]] | |||
[[Kategorie:AHR_I_Informatik_LK]] | |||
[[Kategorie:FI_I_TP2]] | |||