<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.flbk-hamm.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thomas</id>
	<title>FLBK-Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.flbk-hamm.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thomas"/>
	<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/Spezial:Beitr%C3%A4ge/Thomas"/>
	<updated>2026-05-06T18:52:18Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Blackboxtest&amp;diff=2753</id>
		<title>Blackboxtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Blackboxtest&amp;diff=2753"/>
		<updated>2026-02-20T11:35:27Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Übersicht Testverfahren.jpg|mini]]&lt;br /&gt;
Blackboxtests gehören zur Kategorie der dynamischen Testverfahren. Das Ziel des Blackboxtests ist es, die Übereinstimmung eines Softwaresystems mit seinen in der Analysephase eines Softwareentwicklungsprozesses spezifizierten Anforderungen zu überprüfen. Ausgehend von formalen oder informalen Spezifikationen werden Testfälle erarbeitet, die sicherstellen, dass der geforderte Funktionsumfang eingehalten wird. Vor diesem Hintergrund wird die Notwendigkeit, Anforderungen sorgfältig und formal zu beschreiben, besonders deutlich.&lt;br /&gt;
&lt;br /&gt;
Dieser Test wird ohne die Kenntnisse über die innere Funktionsweise des zu testenden Systems durchgeführt. Das Innenleben des zu testenden System bleibt im Dunkeln wie in einer schwarzen Kiste. Der Fokus liegt auf dem funktionsorientierten Testen, d. h. für die Ermittlung der Testfälle werden nur die Anforderungen, aber nicht die Implementierung des Testobjekts herangezogen. Nur nach außen sichtbares Verhalten wird im Balckboxtest berücksichtigt. Die Blackbox-Testverfahren gehen davon aus, daß die Implementierung einer Funktionalität unbedeutend ist. Statt dessen wird überprüft, ob die in der Spezifikation verlangte Funktionalität erfüllt ist. Es handelt sich also um ein Testen auf höherer Ebene, von einzelnen [[Klasse|Klassen]] (Komponententest) über das Zusammenspiel von Klassen (Integrationstest) bis zum Testen des Gesamt-Systems.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz ist sehr gut vereinbar mit der [[Objektorientierung|objektorientierten]] Programmierung wie z.B. [[Java]], da auch hier das Bilden von logischen Modulen, [[Klasse|Klassen]] und [[Objekt|Objekten]], im Vordergrund steht. Die innere Realisierung der Funktionalität ist dabei für den Anwender des Systems oder sogar für den Entwickler, welcher diese Klassen weiter verwendet, unbekannt. Blackboxtests eignen sich sehr gut für automatisiertes Testen. &lt;br /&gt;
&lt;br /&gt;
Wurde das Fehlverhalten einer Komponente ermittelt, kann es mit [[Whiteboxtest|Whiteboxtests]] oder statischen Testverfahren, wie z.B. [[Schreibtischtest|Schreibtischtests]], tiefer analysiert werden.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Whiteboxtest&amp;diff=2752</id>
		<title>Whiteboxtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Whiteboxtest&amp;diff=2752"/>
		<updated>2026-02-20T11:32:27Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Übersicht Testverfahren.jpg|mini]]&lt;br /&gt;
White-Box-Test bezeichnet eine dynamische Methode des Software-Tests, bei der die Tests mit Einblick in die innere Funktionsweise des zu testenden Systems entwickelt werden. Im Gegensatz zum [[Blackboxtest|Black-Box-Test]] ist für diesen Test also ein Blick in den [[Quelltext|Quellcode]] gestattet, d. h. es wird am Code geprüft.&lt;br /&gt;
&lt;br /&gt;
White-Box-Tests werden eingesetzt, um Fehler in den Teilkomponenten aufzudecken und zu lokalisieren, sind aber kein geeignetes Mittel, Fehler gegenüber der [[Softwareentwicklungsprozess|Anforderungsspezifikation]] aufzudecken. Für letzteres benötigt man [[Blackboxtest|Black-Box-Tests]]. Zu bedenken ist auch, dass zwei Komponenten, die für sich genommen korrekt gemäß ihrer jeweiligen Teilspezifikation arbeiten, zusammen nicht zwangsläufig eine korrekte Einheit gemäß der Gesamtspezifikation bilden. Dies kann durch Black-Box-Tests leichter festgestellt werden als durch White-Box-Tests.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Whiteboxtest&amp;diff=2751</id>
		<title>Whiteboxtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Whiteboxtest&amp;diff=2751"/>
		<updated>2026-02-20T11:31:57Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Übersicht Testverfahren.jpg|mini]]&lt;br /&gt;
White-Box-Test bezeichnet eine dynamische Methode des Software-Tests, bei der die Tests mit Einblick in die innere Funktionsweise des zu testenden Systems entwickelt werden. Im Gegensatz zum [[Blackboxtest|Black-Box-Test]] ist für diesen Test also ein Blick in den [[Quelltext|Quellcode]] gestattet, d. h. es wird am Code geprüft.&lt;br /&gt;
&lt;br /&gt;
White-Box-Tests werden eingesetzt, um Fehler in den Teilkomponenten aufzudecken und zu lokalisieren, sind aber kein geeignetes Mittel, Fehler gegenüber der Anforderungsspezifikation aufzudecken. Für letzteres benötigt man [[Blackboxtest|Black-Box-Tests]]. Zu bedenken ist auch, dass zwei Komponenten, die für sich genommen korrekt gemäß ihrer jeweiligen Teilspezifikation arbeiten, zusammen nicht zwangsläufig eine korrekte Einheit gemäß der Gesamtspezifikation bilden. Dies kann durch Black-Box-Tests leichter festgestellt werden als durch White-Box-Tests.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Whiteboxtest&amp;diff=2750</id>
		<title>Whiteboxtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Whiteboxtest&amp;diff=2750"/>
		<updated>2026-02-20T11:31:37Z</updated>

		<summary type="html">&lt;p&gt;Thomas: Die Seite wurde neu angelegt: „== Einführung == White-Box-Test bezeichnet eine dynamische Methode des Software-Tests, bei der die Tests mit Einblick in die innere Funktionsweise des zu testenden Systems entwickelt werden. Im Gegensatz zum Black-Box-Test ist für diesen Test also ein Blick in den Quellcode gestattet, d. h. es wird am Code geprüft.  White-Box-Tests werden eingesetzt, um Fehler in den Teilkomponenten aufzudecken und zu lokalisieren, sind a…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
White-Box-Test bezeichnet eine dynamische Methode des Software-Tests, bei der die Tests mit Einblick in die innere Funktionsweise des zu testenden Systems entwickelt werden. Im Gegensatz zum [[Blackboxtest|Black-Box-Test]] ist für diesen Test also ein Blick in den [[Quelltext|Quellcode]] gestattet, d. h. es wird am Code geprüft.&lt;br /&gt;
&lt;br /&gt;
White-Box-Tests werden eingesetzt, um Fehler in den Teilkomponenten aufzudecken und zu lokalisieren, sind aber kein geeignetes Mittel, Fehler gegenüber der Anforderungsspezifikation aufzudecken. Für letzteres benötigt man [[Blackboxtest|Black-Box-Tests]]. Zu bedenken ist auch, dass zwei Komponenten, die für sich genommen korrekt gemäß ihrer jeweiligen Teilspezifikation arbeiten, zusammen nicht zwangsläufig eine korrekte Einheit gemäß der Gesamtspezifikation bilden. Dies kann durch Black-Box-Tests leichter festgestellt werden als durch White-Box-Tests.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Unit-test&amp;diff=2749</id>
		<title>Unit-test</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Unit-test&amp;diff=2749"/>
		<updated>2026-02-20T11:29:20Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Unit-Tests sind eine Art von Software-Tests, bei denen einzelne, isolierte Teile eines Programms (Units) auf ihre korrekte Funktionalität überprüft werden. Diese Units sind in der Regel kleine, wiederverwendbare Code-Abschnitte wie Methoden oder Funktionen.&lt;br /&gt;
&lt;br /&gt;
Obwohl der Entwickler den Code kennt, schreibt man idealerweise Unit-Tests nach dem [[Blackboxtest|Blackbox]]-Prinzip. Man definiert Eingabewerte und erwartet ein bestimmtes Ergebnis, ohne sich darauf zu verlassen, wie die Logik intern implementiert ist. &lt;br /&gt;
&lt;br /&gt;
=== Ziel von Unit-Tests: ===&lt;br /&gt;
&lt;br /&gt;
* Fehler frühzeitig erkennen: Durch das Testen einzelner Komponenten können Fehler bereits in der Entwicklungsphase identifiziert und behoben werden.&lt;br /&gt;
* Codequalität verbessern: Unit-Tests fördern sauberen, gut strukturierten und wartbaren Code.&lt;br /&gt;
* Regressionen verhindern: Wenn neue Funktionen hinzugefügt oder bestehender Code geändert wird, können Unit-Tests sicherstellen, dass bereits vorhandene Funktionalität nicht beeinträchtigt wird.&lt;br /&gt;
* Dokumentation: Gut geschriebene Unit-Tests dienen als lebendige Dokumentation des Codes und machen sein Verhalten verständlicher.&lt;br /&gt;
&lt;br /&gt;
=== Werkzeuge für Unit-Tests ===&lt;br /&gt;
* JUnit: Das am weitesten verbreitete Java-Framework für Unit-Tests.&lt;br /&gt;
* NUnit: Für .NET-Anwendungen.&lt;br /&gt;
* pytest: Für Python.&lt;br /&gt;
* Jest: Für JavaScript.&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Java mit JUnit) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Klasse zu testende Klasse&lt;br /&gt;
public class Calculator {&lt;br /&gt;
    public int add(int a, int b) {&lt;br /&gt;
        return a + b;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// JUnit Test&lt;br /&gt;
import static org.junit.jupiter.api.Assertions.assertEquals;&lt;br /&gt;
import org.junit.jupiter.api.Test;&lt;br /&gt;
public class CalculatorTest {&lt;br /&gt;
    @Test&lt;br /&gt;
    public void testAdd() {&lt;br /&gt;
        Calculator calculator = new Calculator();&lt;br /&gt;
        int result = calculator.add(2, 3);&lt;br /&gt;
        assertEquals(5, result);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In diesem Beispiel wird die add-[[Methode]] der Calculator-[[Klasse]] getestet. Der Test erwartet, dass die Summe von 2 und 3 gleich 5 ist.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Blackboxtest&amp;diff=2748</id>
		<title>Blackboxtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Blackboxtest&amp;diff=2748"/>
		<updated>2026-02-20T11:29:08Z</updated>

		<summary type="html">&lt;p&gt;Thomas: Die Seite wurde neu angelegt: „== Einführung == mini Blackboxtests gehören zur Kategorie der dynamischen Testverfahren. Das Ziel des Blackboxtests ist es, die Übereinstimmung eines Softwaresystems mit seinen in der Analysephase eines Softwareentwicklungsprozesses spezifizierten Anforderungen zu überprüfen. Ausgehend von formalen oder informalen Spezifikationen werden Testfälle erarbeitet, die sicherstellen, dass der geforderte Funktionsumfan…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Übersicht Testverfahren.jpg|mini]]&lt;br /&gt;
Blackboxtests gehören zur Kategorie der dynamischen Testverfahren. Das Ziel des Blackboxtests ist es, die Übereinstimmung eines Softwaresystems mit seinen in der Analysephase eines Softwareentwicklungsprozesses spezifizierten Anforderungen zu überprüfen. Ausgehend von formalen oder informalen Spezifikationen werden Testfälle erarbeitet, die sicherstellen, dass der geforderte Funktionsumfang eingehalten wird. Vor diesem Hintergrund wird die Notwendigkeit, Anforderungen sorgfältig und formal zu beschreiben, besonders deutlich.&lt;br /&gt;
&lt;br /&gt;
Dieser Test wird ohne die Kenntnisse über die innere Funktionsweise des zu testenden Systems durchgeführt. Das Innenleben des zu testenden System bleibt im Dunkeln wie in einer schwarzen Kiste. Der Fokus liegt auf dem funktionsorientierten Testen, d. h. für die Ermittlung der Testfälle werden nur die Anforderungen, aber nicht die Implementierung des Testobjekts herangezogen. Nur nach außen sichtbares Verhalten wird im Balckboxtest berücksichtigt. Die Blackbox-Testverfahren gehen davon aus, daß die Implementierung einer Funktionalität unbedeutend ist. Statt dessen wird überprüft, ob die in der Spezifikation verlangte Funktionalität erfüllt ist. Es handelt sich also um ein Testen auf höherer Ebene, von einzelnen [[Klasse|Klassen]] (Komponententest) über das Zusammenspiel von Klassen (Integrationstest) bis zum Testen des Gesamt-Systems.&lt;br /&gt;
&lt;br /&gt;
Dieser Ansatz ist sehr gut vereinbar mit der [[Objektorientierung|objektorientierten]] Programmierung wie z.B. [[Java]], da auch hier das Bilden von logischen Modulen, [[Klasse|Klassen]] und [[Objekt|Objekten]], im Vordergrund steht. Die innere Realisierung der Funktionalität ist dabei für den Anwender des Systems oder sogar für den Entwickler, welcher diese Klassen weiter verwendet, unbekannt. Blackboxtests eignen sich sehr gut für automatisiertes Testen. &lt;br /&gt;
&lt;br /&gt;
Wurde das Fehlverhalten einer Komponente ermittelt, kann es mit Whiteboxtests oder statischen Testverfahren, wie z.B. [[Schreibtischtest|Schreibtischtests]], tiefer analysiert werden.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Unit-test&amp;diff=2747</id>
		<title>Unit-test</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Unit-test&amp;diff=2747"/>
		<updated>2026-02-20T11:09:04Z</updated>

		<summary type="html">&lt;p&gt;Thomas: Die Seite wurde neu angelegt: „== Einführung == Unit-Tests sind eine Art von Software-Tests, bei denen einzelne, isolierte Teile eines Programms (Units) auf ihre korrekte Funktionalität überprüft werden. Diese Units sind in der Regel kleine, wiederverwendbare Code-Abschnitte wie Methoden oder Funktionen.  === Ziel von Unit-Tests: ===  * Fehler frühzeitig erkennen: Durch das Testen einzelner Komponenten können Fehler bereits in der Entwicklungsphase identifiziert und behoben werde…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Unit-Tests sind eine Art von Software-Tests, bei denen einzelne, isolierte Teile eines Programms (Units) auf ihre korrekte Funktionalität überprüft werden. Diese Units sind in der Regel kleine, wiederverwendbare Code-Abschnitte wie Methoden oder Funktionen.&lt;br /&gt;
&lt;br /&gt;
=== Ziel von Unit-Tests: ===&lt;br /&gt;
&lt;br /&gt;
* Fehler frühzeitig erkennen: Durch das Testen einzelner Komponenten können Fehler bereits in der Entwicklungsphase identifiziert und behoben werden.&lt;br /&gt;
* Codequalität verbessern: Unit-Tests fördern sauberen, gut strukturierten und wartbaren Code.&lt;br /&gt;
* Regressionen verhindern: Wenn neue Funktionen hinzugefügt oder bestehender Code geändert wird, können Unit-Tests sicherstellen, dass bereits vorhandene Funktionalität nicht beeinträchtigt wird.&lt;br /&gt;
* Dokumentation: Gut geschriebene Unit-Tests dienen als lebendige Dokumentation des Codes und machen sein Verhalten verständlicher.&lt;br /&gt;
&lt;br /&gt;
=== Werkzeuge für Unit-Tests ===&lt;br /&gt;
* JUnit: Das am weitesten verbreitete Java-Framework für Unit-Tests.&lt;br /&gt;
* NUnit: Für .NET-Anwendungen.&lt;br /&gt;
* pytest: Für Python.&lt;br /&gt;
* Jest: Für JavaScript.&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Java mit JUnit) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Klasse zu testende Klasse&lt;br /&gt;
public class Calculator {&lt;br /&gt;
    public int add(int a, int b) {&lt;br /&gt;
        return a + b;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// JUnit Test&lt;br /&gt;
import static org.junit.jupiter.api.Assertions.assertEquals;&lt;br /&gt;
import org.junit.jupiter.api.Test;&lt;br /&gt;
public class CalculatorTest {&lt;br /&gt;
    @Test&lt;br /&gt;
    public void testAdd() {&lt;br /&gt;
        Calculator calculator = new Calculator();&lt;br /&gt;
        int result = calculator.add(2, 3);&lt;br /&gt;
        assertEquals(5, result);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In diesem Beispiel wird die add-[[Methode]] der Calculator-[[Klasse]] getestet. Der Test erwartet, dass die Summe von 2 und 3 gleich 5 ist.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Schreibtischtest&amp;diff=2746</id>
		<title>Schreibtischtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Schreibtischtest&amp;diff=2746"/>
		<updated>2026-02-20T11:05:10Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Beispiel Schreibtisschtest.png|mini]]&lt;br /&gt;
Der Schreibtischtest ist ein Verfahren, das im Bereich der Softwareentwicklung verwendet wird, um [[Algorithmus|Algorithmen]] oder Routinen auf Richtigkeit zu prüfen. Der Schreibtischtest wird nicht mit Hilfe eines Rechners durchgeführt, sondern vielmehr im Kopf des Entwicklers. Dazu werden für einen deterministischen und terminierenden Programmablauf eine Eingabe- und eine mögliche Ausgabemenge festgelegt. Anschließend wird mit jedem Element der Eingabemenge durch schrittweises Durchrechnen die Korrektheit des Programmablaufs überprüft. Der gewählte Programmablauf verhält sich für das gewählte Eingabeelement genau dann korrekt, wenn das ausgegebene Element, also das Ergebnis, Teil der Ausgabemenge ist. Man könnte es auch als analoges [[Debugger|debugging]] bezeichnen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Tatsache, dass die Eingabemenge für einen Algorithmus beliebig groß sein kann, z. B. eine Untermenge der natürlichen Zahlen, erfordert vom Entwickler zur Überprüfung der Korrektheit des zu testenden Programms die schrittweise Durchrechnung mit allen Elementen der Eingabemenge. Gibt es für die Eingabemenge keine obere oder untere Schranke, dann kann der Schreibtischtest höchstens mit einigen plausiblen Eingaben ein Indiz dafür liefern, dass der Algorithmus richtig implementiert wurde.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen für den Schreibtischtest sind also ein deterministischer und terminierender Programmablauf, die Kenntnis über plausible und sinnvolle Eingabeelemente, und die Kenntnis der zu den Eingabeelementen passenden Ausgabeelemente, um aus der jeweiligen Ausgabe auf die Richtigkeit schließen zu können. Das Ergebnis für die jeweilige Eingabe muss also bekannt sein.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Selectionsort&amp;diff=2745</id>
		<title>Selectionsort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Selectionsort&amp;diff=2745"/>
		<updated>2026-02-20T11:00:05Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Komplexität */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Ein simpler [[Sortieren|Sortier]]algorithmus 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 Elemente auf der linken Seite der aktuellen Position einen festen Platz und werden nicht mehr geändert.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[Datei:Array Selectionsort.gif|mini]]&lt;br /&gt;
Es soll eine Liste mit dem Inhalt [4|3|1|5|2] sortiert werden.&lt;br /&gt;
Im ersten Durchlauf wird die komplette Liste durchlaufen, um das kleinste Element auszuwählen (Select) und an den Beginn der Liste zu stellen. In diesem Beispiel der Wert 1. Der ursprüngliche Wert der Startposition (hier 4) wird mit dem Wert der Stelle des kleinsten Wertes (hier Wert 1 im Index 2) getauscht. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Animation Selectionsort.gif|mini]]&lt;br /&gt;
Im zweiten Durchlauf beginnt die Suche nach dem kleinsten Element nun im Index 1. Im Index 0 befindet sich bereits das kleinste Element, daher ist eine Suche an der ersten Stelle nicht mehr erforderlich.  Der Rest der Liste wird durchlaufen. Das kleinste Element befindet sich hier zufällig am Ende der Liste. Es wird die 2 als kleinstes Element ausgewählt und die Werte werden mit der neuen Startposition getauscht.&lt;br /&gt;
&lt;br /&gt;
Die Suche wiederholt sich nach dieser Logik bis alle Elemente sortiert wurden. Der Suchbereich sinkt Schritt für Schritt. Folgende Animation visualisiert den Algorithmus.&lt;br /&gt;
&lt;br /&gt;
== Pseudo Code ==&lt;br /&gt;
Der Algorithmus sieht im Pseudocode so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
prozedur SelectionSort( A : Liste sortierbarer Elemente)&lt;br /&gt;
  hoechsterIndex = Elementanzahl( A ) - 1&lt;br /&gt;
  einfuegeIndex = 0&lt;br /&gt;
  wiederhole&lt;br /&gt;
    minPosition = einfuegeIndex&lt;br /&gt;
    für jeden idx von (einfuegeIndex + 1) bis hoechsterIndex wiederhole&lt;br /&gt;
      falls A[ idx ] &amp;lt; A[ minPosition ] dann&lt;br /&gt;
          minPosition = idx&lt;br /&gt;
      ende falls&lt;br /&gt;
    ende für&lt;br /&gt;
    vertausche A[ minPosition ] und A[ einfuegeIndex ]&lt;br /&gt;
    einfuegeIndex = einfuegeIndex + 1&lt;br /&gt;
  solange einfuegeIndex &amp;lt; hoechsterIndex&lt;br /&gt;
prozedur ende&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Java Implementierung ==&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ArrayList&amp;lt;Mitarbeiter&amp;gt; sortierenNachNachnamen(){&lt;br /&gt;
        ArrayList&amp;lt;Mitarbeiter&amp;gt; sortierteListe = mitarbeiterListe;&lt;br /&gt;
        int stelle = 0;&lt;br /&gt;
        while(stelle &amp;lt; sortierteListe.size()){&lt;br /&gt;
            int kleinstesElement = stelle;&lt;br /&gt;
            for(int index = stelle+1; index &amp;lt; sortierteListe.size(); index++){&lt;br /&gt;
&lt;br /&gt;
if(sortierteListe.get(index).getNachname().compareTo(sortierteListe.get(kleinstesElement).getNachname()) &amp;lt; 0){&lt;br /&gt;
                    kleinstesElement = index;&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
            Mitarbeiter puffer = sortierteListe.get(kleinstesElement);&lt;br /&gt;
            sortierteListe.set(kleinstesElement,sortierteListe.get(stelle)) ;&lt;br /&gt;
            sortierteListe.set(stelle,puffer);&lt;br /&gt;
            stelle++;&lt;br /&gt;
        }&lt;br /&gt;
        return sortierteListe;&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
Mit Hilfe der [[Laufzeitanalyse]] betrachten wir nun die Zeitkomplexität des [[Algorithmus]] SelectionSort.&lt;br /&gt;
&lt;br /&gt;
Um eine Datenstruktur  (z.B. eine [[Array]]) mit 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 Anzahl der notwendigen Vergleiche. SelectionSort liegt somit in der Komplexitätsklasse &amp;lt;math&amp;gt;O(n^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:AHR_I_Informatik_LK]]&lt;br /&gt;
[[Kategorie:FI_I_TP2]]&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2744</id>
		<title>Quicksort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2744"/>
		<updated>2026-02-20T10:59:49Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Best Case */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Rekursive Baumstruktur.jpg|mini]]&lt;br /&gt;
Ein oft eingesetzter [[Sortieren|Sortier]]-Algorithmus ist der Quicksort. Der Quicksort funktioniert nach dem Prinzip »teile und herrsche«, was mit Hilfe der [[Rekursion]] realisiert wird. Die zu sortierenden [[Daten]] werden immer in zwei Teile zerlegt (&amp;quot;Teile&amp;quot;) und wieder sortiert (&amp;quot;Herrsche&amp;quot;)). Diese zwei Teile werden wiederum jeweils in zwei Teile zerlegt und sortiert usw., bis die Daten sortiert sind. Die [[Rekursion]] beendet sich, wenn das Teilstück aus nur noch einem Element besteht (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm#mj035bded10a26be556df779f234784e89).&lt;br /&gt;
&lt;br /&gt;
Die Zerlegung in zwei Teile erfolgt anhand eines sogenannten Pivot-Elementes. Ein Element der Liste wird als Pivot Element ausgewählt und dann werden alle weiteren Elemente der zu sortierenden Liste mit diesem Element verglichen. Die zu sortierende Liste wird in zwei Bereiche unterteilt. Alle Elemente die kleiner sind als das Pivot-Element werden links von dem Pivot-Element einsortiert. Alle Elemente die größer sind, werden rechts von Pivot-Element abgelegt.&lt;br /&gt;
&lt;br /&gt;
Die Elemente, die gleich dem Pivotelement sind, können sich beliebig auf die Teillisten verteilen. Nach der Aufteilung sind die Elemente der linken Liste kleiner oder gleich dem Pivot-Element und somit auch kleiner oder gleich den Elementen der rechten Liste. Die Elemente der linken und rechten Liste sind je Liste noch unsortiert.&lt;br /&gt;
&lt;br /&gt;
Anschließend muss man noch jede Teilliste in sich sortieren, um die Sortierung zu vollenden. Dazu wird der Quicksort-Algorithmus jeweils auf der linken und auf der rechten Teilliste ausgeführt. Jede Teilliste wird dann wieder in zwei Teillisten aufgeteilt und auf diese jeweils wieder der Quicksort-Algorithmus angewandt, und so fort.&lt;br /&gt;
&lt;br /&gt;
Die Teillisten sind immer Abschnitte auf der ursprünglichen Liste, so dass kein zusätzlicher Speicher benötigt wird. &lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Als Beispiel betrachten wir eine Liste mit Zahlen. Wir wählen immer das erste Element als Pivot-Element. Zu Beginn ist die Zahl 7  zufällig das Pivot-Element.&lt;br /&gt;
&lt;br /&gt;
7 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;10 8&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;11&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;3 1 5 2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zahlen, die kleiner als das Pivot-Element 7 sind, wurden blau markiert. Die Zahlen größer 7 haben sind rot markiert. Als ersten Schritt ändert QuickSort die Liste folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; 1 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun sind alle Zahlen, welche kleiner sind als 7, links von ihr. Alle Zahlen welche größer sind als die 7, stehen rechts. Die Reihenfolge der Zahlen in den Teillisten ist hier willkürlich und hängt ab von der jeweiligen Implementierung. Entscheidend ist, dass alle Zahlen die kleiner sind als 7 links stehen und alle Zahlen die größer sind als 7 rechts.&lt;br /&gt;
&lt;br /&gt;
Als nächstes wird der Teil links von der 7 wieder per QuickSort sortiert. Als Pivot wird die Zahl 3 gewählt.  Die Zahlen die kleiner sind als 3 werden wieder blau markiert. Alle Zahlen größer 3 sind rot. Die Zahl 7 und die größeren Zahlen betrachten wir im Moment nicht, deshalb sind sie gelb hinterlegt:&lt;br /&gt;
&lt;br /&gt;
 3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus bringt die blauen und die roten Zahlen wieder in die richtige Ordnung. Man erhält dann das Folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1 2&amp;lt;/span&amp;gt; 3 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;6 5 4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Das wird fortgesetzt bis der linke Teil des Arrays sortiert ist. Das sieht dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;&#039;&#039;1  2  3  4  5  6&#039;&#039;&#039;&#039;&#039;  7  9 11  8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun wird rechts von der 7 sortiert. Wieder wird ein Pivot gewählt, hier die 9, und die kleineren und größeren Zahlen auf die jeweils richtige Seite gebracht.&lt;br /&gt;
&lt;br /&gt;
Der grundsätzlichen Algorithmus lässt mit PseudoCode wie folgt beschreiben:&lt;br /&gt;
&lt;br /&gt;
== Pseudocode ==&lt;br /&gt;
Der folgende Pseudocode illustriert die Arbeitsweise des [[Algorithmus]]. Bei jedem Aufruf von quicksort(...) gibt links den Index des ersten Elements in der Teilliste an und rechts den des letzten. Beim ersten Aufruf (oberste Rekursionsebene) ist links = 0 und rechts = n-1. Die übergebene Liste wird dabei [[Rekursion|rekursiv]] immer weiter geteilt, bis sie nur noch einen Wert enthält.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
funktion quicksort(links, rechts) &lt;br /&gt;
    falls links &amp;lt; rechts dann &lt;br /&gt;
        teiler := teile(links, rechts) &lt;br /&gt;
        quicksort(links, teiler - 1) &lt;br /&gt;
        quicksort(teiler + 1, rechts) &lt;br /&gt;
    ende&lt;br /&gt;
ende&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wahl des Pivot-Elements ==&lt;br /&gt;
Die Wahl des Pivotelements ist wichtig. Die schlechteste Wahl des Pivots ist das Element, welches ganz am linken oder ganz am rechten Rand des zu sortierenden Intervalls endet. Mit linkem oder rechten Element ist nicht das Element gemeint, welches sich in der unsortierten Liste ganz Links (im Beispiel die 7) oder rechts befindet, sondern das kleinste (im Beispiel die 1) bzw. das größte Element (im Beispiel die 12). Der QuickSort ist dann am Effizientesten, wenn man ein Pivot-Element wählt, welches am Schluss genau in der Mitte zu liegen kommt (im Beispiel die 6 oder die 7). Leider ist dieses Element nicht ganz einfach zu finden.&lt;br /&gt;
&lt;br /&gt;
Man sollte deshalb nicht immer wie im Beispiel das erste Element als Pivot wählen. Dies ist zwar leicht zu implementieren, allerdings führt dies zu einem langsamen &amp;quot;QuickSort&amp;quot;, falls  das Array bereits sortiert ist, oder nahezu sortiert ist.&lt;br /&gt;
&lt;br /&gt;
Als Kompromiss wird oft ein zufälliges Element als Pivot-Element genommen. Noch besser kann es sein, von drei zufällig gewählten Elementen jeweils das mittlere zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Java Implementierung ==&lt;br /&gt;
Bisher wurde die allgemeine Funktionsweise des Quicksorts beschrieben. Am Besten lassen sich komplexe [[Algorithmus|Algorithmen]] nachvollziehen, wenn Sie anhand einer Implementierung mit Hilfe eines [[Debugger|Debuggers]] analysiert werden.  Mit Hilfe des Quicksorts können beliebige Datenstrukturen sortiert werden. In der folgenden [[Java]] Implementierung wird ein [[Array]] bestehend aus Integern (kurz int) sortiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void quickSort(int array[], int links, int rechts) {&lt;br /&gt;
      if (links &amp;lt; rechts) {&lt;br /&gt;
         int i = teile(array,links,rechts);&lt;br /&gt;
         quickSort(array,links,i-1);&lt;br /&gt;
         quickSort(array,i+1,rechts);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public  int teile(int array[], int links, int rechts) {&lt;br /&gt;
      int pivot, i, j, help;&lt;br /&gt;
      pivot = array[rechts];               &lt;br /&gt;
      i     = links;&lt;br /&gt;
      j     = rechts-1;&lt;br /&gt;
      while(i&amp;lt;=j) {&lt;br /&gt;
         if (array[i] &amp;gt; pivot) {     &lt;br /&gt;
            // tausche x[i] und x[j]&lt;br /&gt;
            help = array[i]; &lt;br /&gt;
            array[i] = array[j]; &lt;br /&gt;
            array[j] = help;                             &lt;br /&gt;
&lt;br /&gt;
            j--;&lt;br /&gt;
         } else i++;            &lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // tausche x[i] und x[rechts]&lt;br /&gt;
      help      = array[i];&lt;br /&gt;
      array[i]      = array[rechts];&lt;br /&gt;
      array[rechts] = help;&lt;br /&gt;
      return i;&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Laufzeitanalyse ==&lt;br /&gt;
=== Worst-Case ===&lt;br /&gt;
[[Datei:Baum N-Ebenen.png|mini]]&lt;br /&gt;
Betrachten wir zunächst die Worst-Case-[[Laufzeitanalyse]]. Angenommen, wir haben wirklich Pech und die Partitionsgrößen sind wirklich unausgeglichen. Angenommen, der von der Partitionsfunktion ausgewählte Drehpunkt ist immer entweder das kleinste oder das größte Element im Subarray für n-Elemente. Dann enthält eine der Partitionen keine Elemente und die andere Partition enthält n-1 Elemente - alle außer dem Pivot. Die rekursiven Aufrufe erfolgen also auf Subarrays der Größen 0 und n-1.&lt;br /&gt;
&lt;br /&gt;
In diesem Szenario benötigt [[Rekursion|rekursive]] Aufruf von n-1  Elementen c* (n - 1) für eine Konstante c. Dies Konstante c repräsentiert die Benötigte Zeit für eine Operation wie einen Aufruf oder einen Vergleich. Für n-2 Elemente werden die Zeit c*(n-2) benötigt und so weiter (siehe Abbildung).&lt;br /&gt;
&lt;br /&gt;
Wenn wir die Partitionierungszeiten für jede Ebene aufsummieren, erhalten wir nach der [[Arithmetische-reihe|gauschen Summenformel]]:&lt;br /&gt;
&amp;lt;math&amp;gt;cn+c(n−1)+c(n−2)+⋯+2c = c(n+(n−1)+(n−2)+⋯+2) =c((n+1)(n/2)−1)&amp;lt;/math&amp;gt; &lt;br /&gt;
Im Rahmend er [[Laufzeitanalyse]] ignorieren wir Terme niedriger Ordnung und konstante Koeffizienten. In der Big-Θ-Notation folgt hieraus die Worst-Case-Laufzeit von QuickSort &amp;lt;math&amp;gt; O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Best Case ==&lt;br /&gt;
[[Datei:Verzweigungsbaum Quicksort symetrisch.png|mini]]&lt;br /&gt;
Der beste Fall von Quicksort liegt vor, wenn die Partitionen so gleichmäßig wie möglich aufgeteilt werden: Ihre Größen sind entweder gleich oder weichen nur um ein Element  voneinander ab. &lt;br /&gt;
&lt;br /&gt;
[[Datei:SubArrays symetrisch Quicksort.png|mini]]&lt;br /&gt;
Der erstere Fall tritt auf, wenn das Subarray eine ungerade Anzahl von Elementen hat und der Drehpunkt nach der Partitionierung genau in der Mitte liegt und jede Partition &amp;lt;math&amp;gt;(n-1) / 2 &amp;lt;/math&amp;gt; hat.  Der letztere Fall tritt auf, wenn das Subarray eine gerade Anzahl n von Elementen hat und eine Partition n / 2 hat, während die andere n-1 / 2 hat. In beiden Fällen hat jede Partition höchstens n / 2 Elemente.&lt;br /&gt;
&lt;br /&gt;
Wird die Anzahl  der zu sortierenden Elemente n verdoppelt, muss nur eine neue Ebene mit Teilarrays erzeugt werden. Dieses Wachstum lässt sich mit &amp;lt;math&amp;gt;log(n) &amp;lt;/math&amp;gt; beschreiben.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Zu sortierende Elemente n&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 16&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 32&lt;br /&gt;
|-&lt;br /&gt;
! Zu sortierende Elemente n&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^3}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^4}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^5}&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl Ebene log(n)&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 2&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 3&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In jeder Ebene müssen n Elemente sortiert werden. Hieraus ergibt sich eine Laufzeit von &amp;lt;math&amp;gt; O(n * log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:AHR_I_Informatik_LK]]&lt;br /&gt;
[[Kategorie:FI_I_TP2]]&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2743</id>
		<title>Insertionsort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2743"/>
		<updated>2026-02-20T10:59:10Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Komplexität */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführung&lt;br /&gt;
Der [[Algorithmus]] dieses [[Sortieren|Sortierverfahrens]] ist relative simpel. Das Prinzip von Insertion Sort ist: Die einzelnen Elemente werden von vorne nach hinten durchlaufen. Von der aktuellen Position aus wird jedes Element von rechts nach links weitergereicht – und das so lange, bis das bewegte Element größer oder gleich dem Element ist, das an der im Augenblick abgefragten Position liegt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).&lt;br /&gt;
&lt;br /&gt;
Der Platz für das Element, das verschoben wird, ist frei. Diese Lücke wird mit dem entsprechenden Wert an der richtigen Stelle gefüllt.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[Datei:Animation Insertio-Sort.gif|mini]]&lt;br /&gt;
Die folgende Tabelle zeigt die Sortier­schritte zum Sortieren der Folge 5 7 0 3 4 2 6 1. Auf der linken Seite grün dargestellt befindet sich jeweils der bereits sortierte Teil der Folge. Die blauen Ziffern repräsentieren den unsortierten Teil der Zahlenfolge. Ganz rechts steht in Klammern die Anzahl der Positionen, um die das eingefügte Element nach links gewandert ist. Das aktuell eingefügte Element ist fett markiert. (http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/insert/insertion.htm).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; font-family:monospace;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (4)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (1)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || (6)&lt;br /&gt;
|}&lt;br /&gt;
== Pseudo Code ==&lt;br /&gt;
Der [[Algorithmus]] sieht im Pseudocode so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight line&amp;gt;&lt;br /&gt;
prozedur INSERTIONSORT(A ist Liste sortierbarer Elemente)&lt;br /&gt;
  wiederhole bis zur Länge von A und beginne beim 2. Element&lt;br /&gt;
  einzusortierender_wert = A an der Stelle i&lt;br /&gt;
  j = i&lt;br /&gt;
    wiederhole solange j &amp;gt; 1 und A an der Stelle j-1 &amp;gt; einzusortierender_wert&lt;br /&gt;
      A an der Stelle j = A an der Stelle j-1&lt;br /&gt;
      j = j − 1&lt;br /&gt;
    ende wiederhole&lt;br /&gt;
   A an der Stelle j = einzusortierender_wert&lt;br /&gt;
  ende wiederhole&lt;br /&gt;
ende prozedur&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
=== Worst Case ===&lt;br /&gt;
Eine sortierte Liste in umgekehrter Reihenfolge ist das Worst Case Szenario für den InsertionSort:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;[11,7,5,3,2,0]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir betrachten nur die Vergleichsoperationen, die wir mit der Variable c messen. Die Anzahl der zu sortierenden Elemente ist entspricht n. &lt;br /&gt;
&lt;br /&gt;
Beim ersten äußeren Schleifendurchlauf ist c = 1. Denn wir müssen nur die Zahl 7 mit der Zahl 11 vergleichen. 7 wird einsortiert und es bildet sich der bereits sortierte Teil (siehe oben) der Datenstruktur.  Beim zweiten Durchlauf der äußeren Schleife benötigen wir zwei Vergleiche , c = 2. Beim dritte Mal, c = 3 bis zum letzten Mal, wenn c = n-1. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅1+c⋅2+c⋅3+⋯c⋅(n−1)=c⋅(1+2+3+⋯+(n−1))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um eine [[Arithmetische-reihe|arithmetische Reihe]], mit der Ausnahme, dass sie bis zu n-1 anstatt n ansteigt. Unter Verwendung unserer Formel für [[Arithmetische-reihe|arithmetische Reihen]], erhalten wir:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅(n−1+1)*((n−1)/2)=cn​2​​/2 − cn/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für sehr große n können   wir den niederwertigen Term &amp;lt;math&amp;gt;cn/2 &amp;lt;/math&amp;gt; und die konstanten Faktoren c und 1/2 verwerfen, so dass gilt:&lt;br /&gt;
&lt;br /&gt;
Der InsertionSort liegt hier in der  Komplexitätsklasse &amp;lt;math&amp;gt;O(n​2​​)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Best Case ===&lt;br /&gt;
Die optimale Eingabe ist ein bereits sortiertes Array. In diesem Fall hat Insertion Sort eine lineare Laufzeit (d. h. &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;). Während jeder Iteration wird das erste verbleibende Element der Eingabe nur mit dem Element ganz rechts des sortierten Unterabschnitts des Arrays verglichen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:AHR_I_Informatik_LK]]&lt;br /&gt;
[[Kategorie:FI_I_TP2]]&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Bubblesort&amp;diff=2742</id>
		<title>Bubblesort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Bubblesort&amp;diff=2742"/>
		<updated>2026-02-20T10:58:34Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Pseudo Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Der Bubble Sort ist ein relativ einfacher [[Sortieren|Sortieralgorithmus]]. In der Bubble-Phase wird die Eingabe-Liste von links nach rechts durchlaufen. Dabei wird in jedem Schritt das aktuelle Element mit dem rechten Nachbarn verglichen. Falls die beiden Elemente das Sortierkriterium verletzen, werden sie getauscht. Am Ende der Phase steht bei auf- bzw. absteigender Sortierung das größte bzw. kleinste Element der Eingabe am Ende der Liste.&lt;br /&gt;
&lt;br /&gt;
Die Bubble-Phase wird solange wiederholt, bis die Eingabeliste vollständig sortiert ist. Dabei muss das letzte Element des vorherigen Durchlaufs nicht mehr betrachtet werden, da die restliche zu sortierende Eingabe keine größeren bzw. kleineren Elemente mehr enthält.&lt;br /&gt;
&lt;br /&gt;
Je nachdem, ob auf- oder absteigend sortiert wird, steigen die größeren oder kleineren Elemente wie Blasen im Wasser (daher der Name) immer weiter nach oben, das heißt, an das Ende der Liste. Auch werden immer zwei Zahlen miteinander in „Bubbles“ vertauscht.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[Datei:Animation Bubble Sort.gif|mini]]&lt;br /&gt;
Eine Reihe von fünf Zahlen soll aufsteigend sortiert werden. Die fett gedruckten Zahlen werden jeweils verglichen. Ist die linke größer als die rechte, so werden beide vertauscht; das Zahlenpaar ist dann blau markiert. Im ersten Durchlauf wandert somit die größte Zahl ganz nach rechts. Der zweite Durchlauf braucht somit die letzte und vorletzte Position nicht mehr zu vergleichen. → Dritter Durchlauf: kein Vergleich letzte/vorletzte/vorvorletzte....&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;55 07&#039;&#039;&#039;&#039;&#039; 78 12 42   1. Durchlauf&lt;br /&gt;
&lt;br /&gt;
07 &#039;&#039;&#039;&#039;&#039;55 78&#039;&#039;&#039;&#039;&#039; 12 42&lt;br /&gt;
&lt;br /&gt;
07 55 &#039;&#039;&#039;&#039;&#039;78 12&#039;&#039;&#039;&#039;&#039; 42&lt;br /&gt;
&lt;br /&gt;
07 55 12 &#039;&#039;&#039;&#039;&#039;78 42&#039;&#039;&#039;&#039;&#039;   Letzter Vergleich&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;07 55&#039;&#039;&#039;&#039;&#039; 12 42 78   2. Durchlauf&lt;br /&gt;
&lt;br /&gt;
07 &#039;&#039;&#039;&#039;&#039;55 12&#039;&#039;&#039;&#039;&#039; 42 78&lt;br /&gt;
&lt;br /&gt;
07 12 &#039;&#039;&#039;&#039;&#039;55 42&#039;&#039;&#039;&#039;&#039; 78   Letzter Vergleich&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;07 12&#039;&#039;&#039;&#039;&#039; 42 55 78   3. Durchlauf&lt;br /&gt;
&lt;br /&gt;
07 &#039;&#039;&#039;&#039;&#039;12 42&#039;&#039;&#039;&#039;&#039; 55 78   Letzter Vergleich&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;07 12&#039;&#039;&#039;&#039;&#039; 42 55 78   4. Durchlauf + Letzter Vergleich&lt;br /&gt;
&lt;br /&gt;
07 12 42 55 78   Fertig sortiert.&lt;br /&gt;
&lt;br /&gt;
== Pseudo Code ==&lt;br /&gt;
Der [[Algorithmus]] sieht im Pseudocode so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
prozedur bubbleSort(A ist Liste sortierbarer Elemente)&lt;br /&gt;
 n = Länge von A&lt;br /&gt;
 wiederhole solange n&amp;gt;1&lt;br /&gt;
 n=n-1&lt;br /&gt;
 i=0&lt;br /&gt;
  wiederhole solange i&amp;lt;n-1&lt;br /&gt;
    i=i+1&lt;br /&gt;
    falls A an der Stelle i &amp;gt; A an der Stelle i+1 dann&lt;br /&gt;
          A tausche i und i+1&lt;br /&gt;
    ende falls&lt;br /&gt;
  ende wiederhole&lt;br /&gt;
 ende wiederhole&lt;br /&gt;
ende prozedur&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:AHR_I_Informatik_LK]]&lt;br /&gt;
[[Kategorie:FI_I_TP2]]&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2741</id>
		<title>Sortieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2741"/>
		<updated>2026-02-20T10:58:14Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Ein übliches Problem in der Informatik  ist es, Daten zu sortieren. Wer das Sortieren verstanden hat, dem wird es nicht schwerfallen, andere Algorithmen zu verstehen. Das Sortieren könnte man sozusagen auch als »Basics für Algorithmen« bezeichnen.&lt;br /&gt;
[[Datei:Sortiertes kartenspiel.png|mini]]&lt;br /&gt;
&lt;br /&gt;
Primär geht es darum, die einzelnen Sortierverfahren näherzubringen, speziell deren Funktionen. Die Implementierung ist zumeist problemabhängig und richtet sich nach der Art der Daten, die es zu sortieren gilt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).Es gibt unterschiedliche Algorithmen für ein gegebenes Problem und so gibt es  verschiedene Sortierverfahren. Jeder Algorithmus arbeitet unterschiedlich effizient, um ein Problem zu lösen. Die Zeitkomplexität eines Sortieralgorithmus gibt an, wie viele Operationen nötig sind, um einen Sortiervorgang abzuschließen. Bei gegebenen Hardwareausstattung lässt sich also messen, wie lange ein Sortiervorgang dauert.&lt;br /&gt;
&lt;br /&gt;
== Platzkomplexität – In-place ==&lt;br /&gt;
Zusätzlich wird die Platzkomplexität eines Sortierverfahrens betrachtet. Hier wird analysiert, ob und wie viel zusätzlicher Speicher für den Sortiervorgang an sich benötigt wird. Bei in-Place wird nur eine konstante Menge an zusätzlichem Speicher benötigt z.B. Hilfsvariablen für den Dreieckstausch. Bei out-of-place wird eine dynamische Anzahl von zusätzlichem Speicher benötigt die abhängig von der Eingabegröße ist. &lt;br /&gt;
&lt;br /&gt;
== Vergleichsbasierte Verfahren ==&lt;br /&gt;
Sortierverfahren können sich allgemein durch die Basis der Arbeitsweise unterscheiden. Zum einen können Sortieralgorithmen vergleichsbasiert arbeiten oder eben nicht. Das heißt, dass ein Teil der Sortieralgorithmen Vergleiche von Elementen der Liste verwendet, um die Elemente entsprechend in die richtige Reihenfolge zu tauschen. Beim nicht vergleichsbasierten Verfahren liegt der Fokus auf der konditionierten Eingabe.  Im Folgenden werden die vergleichsbasierten sortierverfahren behandelt.&lt;br /&gt;
&lt;br /&gt;
== Stabilität ==&lt;br /&gt;
&lt;br /&gt;
Zusätzliche kann zwischen stabilem und instabilem Verfahren unterschieden werden. Bei stabile Verfahren bleibt die Reihenfolge der Datensätze gleich, deren Sortierschlüssel auch gleich sind. Angenommen man möchte in einem Verein die bereits alphabetisch geordnete Mitglieder nach dem Geburtsdatum sortieren. Stabile Verfahren sorgen dafür, dass die Mitglieder mit gleichem Geburtsdatum weiterhin noch nach der alphabetischen Reihenfolge sortiert bleiben. Das Verfahren sortiert in erster Priorität nach dem Geburtsdatum und in zweiter Priorität  nach alphabetische Reihenfolge.&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Name&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | [[Laufzeitanalyse|Laufzeit]]&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Platzkomplexität&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Stabil&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | In-Place&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Vergleichs-orientiert&lt;br /&gt;
|-&lt;br /&gt;
! Best-Case !! Average-Case !! Worst-Case !! Best-Case !! Average-Case !! Worst-Case&lt;br /&gt;
|-&lt;br /&gt;
| [[Bubble-sort|Bubble Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Insertion-sort|Insertion Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Quicksort]]&lt;br /&gt;
| O(n log n) || O(n log n) || O(n²)&lt;br /&gt;
| O(log n) || O(log n) || O(n)&lt;br /&gt;
| nein || ja/nein || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Selection-sort|Selection Sort]]&lt;br /&gt;
| O(n²) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| nein || ja || ja&lt;br /&gt;
|}&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:AHR_I_Informatik_LK]]&lt;br /&gt;
[[Kategorie:FI_I_TP2]]&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2740</id>
		<title>Sortieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2740"/>
		<updated>2026-02-20T10:56:58Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Ein übliches Problem in der Informatik  ist es, Daten zu sortieren. Wer das Sortieren verstanden hat, dem wird es nicht schwerfallen, andere Algorithmen zu verstehen. Das Sortieren könnte man sozusagen auch als »Basics für Algorithmen« bezeichnen.&lt;br /&gt;
[[Datei:Sortiertes kartenspiel.png|mini]]&lt;br /&gt;
&lt;br /&gt;
Primär geht es darum, die einzelnen Sortierverfahren näherzubringen, speziell deren Funktionen. Die Implementierung ist zumeist problemabhängig und richtet sich nach der Art der Daten, die es zu sortieren gilt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).Es gibt unterschiedliche Algorithmen für ein gegebenes Problem und so gibt es  verschiedene Sortierverfahren. Jeder Algorithmus arbeitet unterschiedlich effizient, um ein Problem zu lösen. Die Zeitkomplexität eines Sortieralgorithmus gibt an, wie viele Operationen nötig sind, um einen Sortiervorgang abzuschließen. Bei gegebenen Hardwareausstattung lässt sich also messen, wie lange ein Sortiervorgang dauert.&lt;br /&gt;
&lt;br /&gt;
== Platzkomplexität – In-place ==&lt;br /&gt;
Zusätzlich wird die Platzkomplexität eines Sortierverfahrens betrachtet. Hier wird analysiert, ob und wie viel zusätzlicher Speicher für den Sortiervorgang an sich benötigt wird. Bei in-Place wird nur eine konstante Menge an zusätzlichem Speicher benötigt z.B. Hilfsvariablen für den Dreieckstausch. Bei out-of-place wird eine dynamische Anzahl von zusätzlichem Speicher benötigt die abhängig von der Eingabegröße ist. &lt;br /&gt;
&lt;br /&gt;
== Vergleichsbasierte Verfahren ==&lt;br /&gt;
Sortierverfahren können sich allgemein durch die Basis der Arbeitsweise unterscheiden. Zum einen können Sortieralgorithmen vergleichsbasiert arbeiten oder eben nicht. Das heißt, dass ein Teil der Sortieralgorithmen Vergleiche von Elementen der Liste verwendet, um die Elemente entsprechend in die richtige Reihenfolge zu tauschen. Beim nicht vergleichsbasierten Verfahren liegt der Fokus auf der konditionierten Eingabe.  Im Folgenden werden die vergleichsbasierten sortierverfahren behandelt.&lt;br /&gt;
&lt;br /&gt;
== Stabilität ==&lt;br /&gt;
&lt;br /&gt;
Zusätzliche kann zwischen stabilem und instabilem Verfahren unterschieden werden. Bei stabile Verfahren bleibt die Reihenfolge der Datensätze gleich, deren Sortierschlüssel auch gleich sind. Angenommen man möchte in einem Verein die bereits alphabetisch geordnete Mitglieder nach dem Geburtsdatum sortieren. Stabile Verfahren sorgen dafür, dass die Mitglieder mit gleichem Geburtsdatum weiterhin noch nach der alphabetischen Reihenfolge sortiert bleiben. Das Verfahren sortiert in erster Priorität nach dem Geburtsdatum und in zweiter Priorität  nach alphabetische Reihenfolge.&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Name&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | [[Laufzeitanalyse|Laufzeit]]&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Platzkomplexität&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Stabil&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | In-Place&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Vergleichs-orientiert&lt;br /&gt;
|-&lt;br /&gt;
! Best-Case !! Average-Case !! Worst-Case !! Best-Case !! Average-Case !! Worst-Case&lt;br /&gt;
|-&lt;br /&gt;
| [[Bubble-sort|Bubble Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Insertion-sort|Insertion Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Quicksort]]&lt;br /&gt;
| O(n log n) || O(n log n) || O(n²)&lt;br /&gt;
| O(log n) || O(log n) || O(n)&lt;br /&gt;
| nein || ja/nein || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Selection-sort|Selection Sort]]&lt;br /&gt;
| O(n²) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| nein || ja || ja&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2739</id>
		<title>Sortieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2739"/>
		<updated>2026-02-20T10:56:34Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführung&lt;br /&gt;
Ein übliches Problem in der Informatik  ist es, Daten zu sortieren. Wer das Sortieren verstanden hat, dem wird es nicht schwerfallen, andere Algorithmen zu verstehen. Das Sortieren könnte man sozusagen auch als »Basics für Algorithmen« bezeichnen.&lt;br /&gt;
[[Datei:Sortiertes kartenspiel.png|mini]]&lt;br /&gt;
&lt;br /&gt;
Primär geht es darum, die einzelnen Sortierverfahren näherzubringen, speziell deren Funktionen. Die Implementierung ist zumeist problemabhängig und richtet sich nach der Art der Daten, die es zu sortieren gilt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).Es gibt unterschiedliche Algorithmen für ein gegebenes Problem und so gibt es  verschiedene Sortierverfahren. Jeder Algorithmus arbeitet unterschiedlich effizient, um ein Problem zu lösen. Die Zeitkomplexität eines Sortieralgorithmus gibt an, wie viele Operationen nötig sind, um einen Sortiervorgang abzuschließen. Bei gegebenen Hardwareausstattung lässt sich also messen, wie lange ein Sortiervorgang dauert.&lt;br /&gt;
&lt;br /&gt;
== Platzkomplexität – In-place ==&lt;br /&gt;
Zusätzlich wird die Platzkomplexität eines Sortierverfahrens betrachtet. Hier wird analysiert, ob und wie viel zusätzlicher Speicher für den Sortiervorgang an sich benötigt wird. Bei in-Place wird nur eine konstante Menge an zusätzlichem Speicher benötigt z.B. Hilfsvariablen für den Dreieckstausch. Bei out-of-place wird eine dynamische Anzahl von zusätzlichem Speicher benötigt die abhängig von der Eingabegröße ist. &lt;br /&gt;
&lt;br /&gt;
== Vergleichsbasierte Verfahren ==&lt;br /&gt;
Sortierverfahren können sich allgemein durch die Basis der Arbeitsweise unterscheiden. Zum einen können Sortieralgorithmen vergleichsbasiert arbeiten oder eben nicht. Das heißt, dass ein Teil der Sortieralgorithmen Vergleiche von Elementen der Liste verwendet, um die Elemente entsprechend in die richtige Reihenfolge zu tauschen. Beim nicht vergleichsbasierten Verfahren liegt der Fokus auf der konditionierten Eingabe.  Im Folgenden werden die vergleichsbasierten sortierverfahren behandelt.&lt;br /&gt;
&lt;br /&gt;
== Stabilität ==&lt;br /&gt;
&lt;br /&gt;
Zusätzliche kann zwischen stabilem und instabilem Verfahren unterschieden werden. Bei stabile Verfahren bleibt die Reihenfolge der Datensätze gleich, deren Sortierschlüssel auch gleich sind. Angenommen man möchte in einem Verein die bereits alphabetisch geordnete Mitglieder nach dem Geburtsdatum sortieren. Stabile Verfahren sorgen dafür, dass die Mitglieder mit gleichem Geburtsdatum weiterhin noch nach der alphabetischen Reihenfolge sortiert bleiben. Das Verfahren sortiert in erster Priorität nach dem Geburtsdatum und in zweiter Priorität  nach alphabetische Reihenfolge.&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Name&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | [[Laufzeitanalyse|Laufzeit]]&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Platzkomplexität&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Stabil&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | In-Place&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Vergleichs-orientiert&lt;br /&gt;
|-&lt;br /&gt;
! Best-Case !! Average-Case !! Worst-Case !! Best-Case !! Average-Case !! Worst-Case&lt;br /&gt;
|-&lt;br /&gt;
| [[Bubble-sort|Bubble Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Insertion-sort|Insertion Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Quicksort]]&lt;br /&gt;
| O(n log n) || O(n log n) || O(n²)&lt;br /&gt;
| O(log n) || O(log n) || O(n)&lt;br /&gt;
| nein || ja/nein || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Selection-sort|Selection Sort]]&lt;br /&gt;
| O(n²) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| nein || ja || ja&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2738</id>
		<title>Sortieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2738"/>
		<updated>2026-02-20T10:56:14Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführung&lt;br /&gt;
Ein übliches Problem in der Informatik  ist es, Daten zu sortieren. Wer das Sortieren verstanden hat, dem wird es nicht schwerfallen, andere Algorithmen zu verstehen. Das Sortieren könnte man sozusagen auch als »Basics für Algorithmen« bezeichnen.&lt;br /&gt;
[[Datei:Sortiertes kartenspiel.png|mini]]&lt;br /&gt;
&lt;br /&gt;
Primär geht es darum, die einzelnen Sortierverfahren näherzubringen, speziell deren Funktionen. Die Implementierung ist zumeist problemabhängig und richtet sich nach der Art der Daten, die es zu sortieren gilt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).Es gibt unterschiedliche Algorithmen für ein gegebenes Problem und so gibt es  verschiedene Sortierverfahren. Jeder Algorithmus arbeitet unterschiedlich effizient, um ein Problem zu lösen. Die Zeitkomplexität eines Sortieralgorithmus gibt an, wie viele Operationen nötig sind, um einen Sortiervorgang abzuschließen. Bei gegebenen Hardwareausstattung lässt sich also messen, wie lange ein Sortiervorgang dauert.&lt;br /&gt;
&lt;br /&gt;
== Platzkomplexität – In-place ==&lt;br /&gt;
Zusätzlich wird die Platzkomplexität eines Sortierverfahrens betrachtet. Hier wird analysiert, ob und wie viel zusätzlicher Speicher für den Sortiervorgang an sich benötigt wird. Bei in-Place wird nur eine konstante Menge an zusätzlichem Speicher benötigt z.B. Hilfsvariablen für den Dreieckstausch. Bei out-of-place wird eine dynamische Anzahl von zusätzlichem Speicher benötigt die abhängig von der Eingabegröße ist. &lt;br /&gt;
&lt;br /&gt;
== Vergleichsbasierte Verfahren ==&lt;br /&gt;
Sortierverfahren können sich allgemein durch die Basis der Arbeitsweise unterscheiden. Zum einen können Sortieralgorithmen vergleichsbasiert arbeiten oder eben nicht. Das heißt, dass ein Teil der Sortieralgorithmen Vergleiche von Elementen der Liste verwendet, um die Elemente entsprechend in die richtige Reihenfolge zu tauschen. Beim nicht vergleichsbasierten Verfahren liegt der Fokus auf der konditionierten Eingabe.  Im Folgenden werden die vergleichsbasierten sortierverfahren behandelt.&lt;br /&gt;
&lt;br /&gt;
== Stabilität ==&lt;br /&gt;
&lt;br /&gt;
Zusätzliche kann zwischen stabilem und instabilem Verfahren unterschieden werden. Bei stabile Verfahren bleibt die Reihenfolge der Datensätze gleich, deren Sortierschlüssel auch gleich sind. Angenommen man möchte in einem Verein die bereits alphabetisch geordnete Mitglieder nach dem Geburtsdatum sortieren. Stabile Verfahren sorgen dafür, dass die Mitglieder mit gleichem Geburtsdatum weiterhin noch nach der alphabetischen Reihenfolge sortiert bleiben. Das Verfahren sortiert in erster Priorität nach dem Geburtsdatum und in zweiter Priorität  nach alphabetische Reihenfolge.&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Name&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Laufzeit&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Platzkomplexität&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Stabil&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | In-Place&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Vergleichs-orientiert&lt;br /&gt;
|-&lt;br /&gt;
! Best-Case !! Average-Case !! Worst-Case !! Best-Case !! Average-Case !! Worst-Case&lt;br /&gt;
|-&lt;br /&gt;
| [[Bubble-sort|Bubble Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Insertion-sort|Insertion Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Quicksort]]&lt;br /&gt;
| O(n log n) || O(n log n) || O(n²)&lt;br /&gt;
| O(log n) || O(log n) || O(n)&lt;br /&gt;
| nein || ja/nein || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Selection-sort|Selection Sort]]&lt;br /&gt;
| O(n²) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| nein || ja || ja&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Selectionsort&amp;diff=2737</id>
		<title>Selectionsort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Selectionsort&amp;diff=2737"/>
		<updated>2026-02-20T10:55:55Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Ein simpler [[Sortieren|Sortier]]algorithmus 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 Elemente auf der linken Seite der aktuellen Position einen festen Platz und werden nicht mehr geändert.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[Datei:Array Selectionsort.gif|mini]]&lt;br /&gt;
Es soll eine Liste mit dem Inhalt [4|3|1|5|2] sortiert werden.&lt;br /&gt;
Im ersten Durchlauf wird die komplette Liste durchlaufen, um das kleinste Element auszuwählen (Select) und an den Beginn der Liste zu stellen. In diesem Beispiel der Wert 1. Der ursprüngliche Wert der Startposition (hier 4) wird mit dem Wert der Stelle des kleinsten Wertes (hier Wert 1 im Index 2) getauscht. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Animation Selectionsort.gif|mini]]&lt;br /&gt;
Im zweiten Durchlauf beginnt die Suche nach dem kleinsten Element nun im Index 1. Im Index 0 befindet sich bereits das kleinste Element, daher ist eine Suche an der ersten Stelle nicht mehr erforderlich.  Der Rest der Liste wird durchlaufen. Das kleinste Element befindet sich hier zufällig am Ende der Liste. Es wird die 2 als kleinstes Element ausgewählt und die Werte werden mit der neuen Startposition getauscht.&lt;br /&gt;
&lt;br /&gt;
Die Suche wiederholt sich nach dieser Logik bis alle Elemente sortiert wurden. Der Suchbereich sinkt Schritt für Schritt. Folgende Animation visualisiert den Algorithmus.&lt;br /&gt;
&lt;br /&gt;
== Pseudo Code ==&lt;br /&gt;
Der Algorithmus sieht im Pseudocode so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
prozedur SelectionSort( A : Liste sortierbarer Elemente)&lt;br /&gt;
  hoechsterIndex = Elementanzahl( A ) - 1&lt;br /&gt;
  einfuegeIndex = 0&lt;br /&gt;
  wiederhole&lt;br /&gt;
    minPosition = einfuegeIndex&lt;br /&gt;
    für jeden idx von (einfuegeIndex + 1) bis hoechsterIndex wiederhole&lt;br /&gt;
      falls A[ idx ] &amp;lt; A[ minPosition ] dann&lt;br /&gt;
          minPosition = idx&lt;br /&gt;
      ende falls&lt;br /&gt;
    ende für&lt;br /&gt;
    vertausche A[ minPosition ] und A[ einfuegeIndex ]&lt;br /&gt;
    einfuegeIndex = einfuegeIndex + 1&lt;br /&gt;
  solange einfuegeIndex &amp;lt; hoechsterIndex&lt;br /&gt;
prozedur ende&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Java Implementierung ==&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ArrayList&amp;lt;Mitarbeiter&amp;gt; sortierenNachNachnamen(){&lt;br /&gt;
        ArrayList&amp;lt;Mitarbeiter&amp;gt; sortierteListe = mitarbeiterListe;&lt;br /&gt;
        int stelle = 0;&lt;br /&gt;
        while(stelle &amp;lt; sortierteListe.size()){&lt;br /&gt;
            int kleinstesElement = stelle;&lt;br /&gt;
            for(int index = stelle+1; index &amp;lt; sortierteListe.size(); index++){&lt;br /&gt;
&lt;br /&gt;
if(sortierteListe.get(index).getNachname().compareTo(sortierteListe.get(kleinstesElement).getNachname()) &amp;lt; 0){&lt;br /&gt;
                    kleinstesElement = index;&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
            Mitarbeiter puffer = sortierteListe.get(kleinstesElement);&lt;br /&gt;
            sortierteListe.set(kleinstesElement,sortierteListe.get(stelle)) ;&lt;br /&gt;
            sortierteListe.set(stelle,puffer);&lt;br /&gt;
            stelle++;&lt;br /&gt;
        }&lt;br /&gt;
        return sortierteListe;&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
Mit Hilfe der [[Laufzeitanalyse]] betrachten wir nun die Zeitkomplexität des [[Algorithmus]] SelectionSort.&lt;br /&gt;
&lt;br /&gt;
Um eine Datenstruktur  (z.B. eine [[Array]]) mit 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 Anzahl der notwendigen Vergleiche. SelectionSort liegt somit in der Komplexitätsklasse &amp;lt;math&amp;gt;O(n^2) &amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Selectionsort&amp;diff=2736</id>
		<title>Selectionsort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Selectionsort&amp;diff=2736"/>
		<updated>2026-02-20T10:55:29Z</updated>

		<summary type="html">&lt;p&gt;Thomas: 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…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
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 Elemente auf der linken Seite der aktuellen Position einen festen Platz und werden nicht mehr geändert.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[Datei:Array Selectionsort.gif|mini]]&lt;br /&gt;
Es soll eine Liste mit dem Inhalt [4|3|1|5|2] sortiert werden.&lt;br /&gt;
Im ersten Durchlauf wird die komplette Liste durchlaufen, um das kleinste Element auszuwählen (Select) und an den Beginn der Liste zu stellen. In diesem Beispiel der Wert 1. Der ursprüngliche Wert der Startposition (hier 4) wird mit dem Wert der Stelle des kleinsten Wertes (hier Wert 1 im Index 2) getauscht. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Animation Selectionsort.gif|mini]]&lt;br /&gt;
Im zweiten Durchlauf beginnt die Suche nach dem kleinsten Element nun im Index 1. Im Index 0 befindet sich bereits das kleinste Element, daher ist eine Suche an der ersten Stelle nicht mehr erforderlich.  Der Rest der Liste wird durchlaufen. Das kleinste Element befindet sich hier zufällig am Ende der Liste. Es wird die 2 als kleinstes Element ausgewählt und die Werte werden mit der neuen Startposition getauscht.&lt;br /&gt;
&lt;br /&gt;
Die Suche wiederholt sich nach dieser Logik bis alle Elemente sortiert wurden. Der Suchbereich sinkt Schritt für Schritt. Folgende Animation visualisiert den Algorithmus.&lt;br /&gt;
&lt;br /&gt;
== Pseudo Code ==&lt;br /&gt;
Der Algorithmus sieht im Pseudocode so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
prozedur SelectionSort( A : Liste sortierbarer Elemente)&lt;br /&gt;
  hoechsterIndex = Elementanzahl( A ) - 1&lt;br /&gt;
  einfuegeIndex = 0&lt;br /&gt;
  wiederhole&lt;br /&gt;
    minPosition = einfuegeIndex&lt;br /&gt;
    für jeden idx von (einfuegeIndex + 1) bis hoechsterIndex wiederhole&lt;br /&gt;
      falls A[ idx ] &amp;lt; A[ minPosition ] dann&lt;br /&gt;
          minPosition = idx&lt;br /&gt;
      ende falls&lt;br /&gt;
    ende für&lt;br /&gt;
    vertausche A[ minPosition ] und A[ einfuegeIndex ]&lt;br /&gt;
    einfuegeIndex = einfuegeIndex + 1&lt;br /&gt;
  solange einfuegeIndex &amp;lt; hoechsterIndex&lt;br /&gt;
prozedur ende&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Java Implementierung ==&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ArrayList&amp;lt;Mitarbeiter&amp;gt; sortierenNachNachnamen(){&lt;br /&gt;
        ArrayList&amp;lt;Mitarbeiter&amp;gt; sortierteListe = mitarbeiterListe;&lt;br /&gt;
        int stelle = 0;&lt;br /&gt;
        while(stelle &amp;lt; sortierteListe.size()){&lt;br /&gt;
            int kleinstesElement = stelle;&lt;br /&gt;
            for(int index = stelle+1; index &amp;lt; sortierteListe.size(); index++){&lt;br /&gt;
&lt;br /&gt;
if(sortierteListe.get(index).getNachname().compareTo(sortierteListe.get(kleinstesElement).getNachname()) &amp;lt; 0){&lt;br /&gt;
                    kleinstesElement = index;&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
            Mitarbeiter puffer = sortierteListe.get(kleinstesElement);&lt;br /&gt;
            sortierteListe.set(kleinstesElement,sortierteListe.get(stelle)) ;&lt;br /&gt;
            sortierteListe.set(stelle,puffer);&lt;br /&gt;
            stelle++;&lt;br /&gt;
        }&lt;br /&gt;
        return sortierteListe;&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
Mit Hilfe der [[Laufzeitanalyse]] betrachten wir nun die Zeitkomplexität des [[Algorithmus]] SelectionSort.&lt;br /&gt;
&lt;br /&gt;
Um eine Datenstruktur  (z.B. eine [[Array]]) mit 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 Anzahl der notwendigen Vergleiche. SelectionSort liegt somit in der Komplexitätsklasse &amp;lt;math&amp;gt;O(n^2) &amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Datei:Animation_Selectionsort.gif&amp;diff=2735</id>
		<title>Datei:Animation Selectionsort.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Datei:Animation_Selectionsort.gif&amp;diff=2735"/>
		<updated>2026-02-20T10:50:55Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Animation Selectionsort&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Datei:Array_Selectionsort.gif&amp;diff=2734</id>
		<title>Datei:Array Selectionsort.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Datei:Array_Selectionsort.gif&amp;diff=2734"/>
		<updated>2026-02-20T10:49:55Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Array Selectionsort&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2733</id>
		<title>Sortieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2733"/>
		<updated>2026-02-20T10:47:40Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführung&lt;br /&gt;
Ein übliches Problem in der Informatik  ist es, Daten zu sortieren. Wer das Sortieren verstanden hat, dem wird es nicht schwerfallen, andere Algorithmen zu verstehen. Das Sortieren könnte man sozusagen auch als »Basics für Algorithmen« bezeichnen.&lt;br /&gt;
[[Datei:Sortiertes kartenspiel.png|mini]]&lt;br /&gt;
&lt;br /&gt;
Primär geht es darum, die einzelnen Sortierverfahren näherzubringen, speziell deren Funktionen. Die Implementierung ist zumeist problemabhängig und richtet sich nach der Art der Daten, die es zu sortieren gilt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).Es gibt unterschiedliche Algorithmen für ein gegebenes Problem und so gibt es  verschiedene Sortierverfahren. Jeder Algorithmus arbeitet unterschiedlich effizient, um ein Problem zu lösen. Die Zeitkomplexität eines Sortieralgorithmus gibt an, wie viele Operationen nötig sind, um einen Sortiervorgang abzuschließen. Bei gegebenen Hardwareausstattung lässt sich also messen, wie lange ein Sortiervorgang dauert.&lt;br /&gt;
&lt;br /&gt;
== Platzkomplexität – In-place ==&lt;br /&gt;
Zusätzlich wird die Platzkomplexität eines Sortierverfahrens betrachtet. Hier wird analysiert, ob und wie viel zusätzlicher Speicher für den Sortiervorgang an sich benötigt wird. Bei in-Place wird nur eine konstante Menge an zusätzlichem Speicher benötigt z.B. Hilfsvariablen für den Dreieckstausch. Bei out-of-place wird eine dynamische Anzahl von zusätzlichem Speicher benötigt die abhängig von der Eingabegröße ist. &lt;br /&gt;
&lt;br /&gt;
== Vergleichsbasierte Verfahren ==&lt;br /&gt;
Sortierverfahren können sich allgemein durch die Basis der Arbeitsweise unterscheiden. Zum einen können Sortieralgorithmen vergleichsbasiert arbeiten oder eben nicht. Das heißt, dass ein Teil der Sortieralgorithmen Vergleiche von Elementen der Liste verwendet, um die Elemente entsprechend in die richtige Reihenfolge zu tauschen. Beim nicht vergleichsbasierten Verfahren liegt der Fokus auf der konditionierten Eingabe.  Im Folgenden werden die vergleichsbasierten sortierverfahren behandelt.&lt;br /&gt;
&lt;br /&gt;
== Stabilität ==&lt;br /&gt;
&lt;br /&gt;
Zusätzliche kann zwischen stabilem und instabilem Verfahren unterschieden werden. Bei stabile Verfahren bleibt die Reihenfolge der Datensätze gleich, deren Sortierschlüssel auch gleich sind. Angenommen man möchte in einem Verein die bereits alphabetisch geordnete Mitglieder nach dem Geburtsdatum sortieren. Stabile Verfahren sorgen dafür, dass die Mitglieder mit gleichem Geburtsdatum weiterhin noch nach der alphabetischen Reihenfolge sortiert bleiben. Das Verfahren sortiert in erster Priorität nach dem Geburtsdatum und in zweiter Priorität  nach alphabetische Reihenfolge.&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Name&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Laufzeit&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Platzkomplexität&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Stabil&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | In-Place&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Vergleichs-orientiert&lt;br /&gt;
|-&lt;br /&gt;
! Best-Case !! Average-Case !! Worst-Case !! Best-Case !! Average-Case !! Worst-Case&lt;br /&gt;
|-&lt;br /&gt;
| [[Bubble-sort|Bubble Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Insertion-sort|Insertion Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Quicksort]]&lt;br /&gt;
| O(n log n) || O(n log n) || O(n²)&lt;br /&gt;
| O(log n) || O(log n) || O(n)&lt;br /&gt;
| nein || ja/nein || ja&lt;br /&gt;
|-&lt;br /&gt;
| Selection Sort&lt;br /&gt;
| O(n²) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| nein || ja || ja&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Algorithmus&amp;diff=2732</id>
		<title>Algorithmus</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Algorithmus&amp;diff=2732"/>
		<updated>2026-02-20T10:47:12Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Laufzeit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein &#039;&#039;&#039;Algorithmus&#039;&#039;&#039; ist in der Informatik ein genau beschriebenes Verfahren zur Lösung eines gegebenen Problems. Ein &#039;&#039;&#039;Programm&#039;&#039;&#039; stellt die Übersetzung eines Algorithmus in eine vom Computer begreifbare und ausführbare Folge von Befehlen dar, an dessen Ende die Lösung eines Problems ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
Problem --&amp;gt; Algorithmus --&amp;gt; Programm&lt;br /&gt;
&lt;br /&gt;
Somit ist ein Algorithmus universeller als eine konkrete Implementierung.&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
&lt;br /&gt;
Zwei oft zu bewältigende Probleme in der Informatik sind das [[Suchen]] und das [[Sortieren]] von [[Objekt|Objekten]]. Allerdings sind Algorithmen für Computer heute so vielfältig wie die Anwendungen, die sie ermöglichen sollen. Vom elektronischen Steuergerät für den Einsatz in KFZ über die Rechtschreib- und Satzbau-Kontrolle in einer Textverarbeitung bis hin zur Analyse von Aktienmärkten finden sich tausende von mehr oder minder tauglich arbeitenden Algorithmen.&lt;br /&gt;
&lt;br /&gt;
Die Lösung komplexer Probleme sollte zuvor designed werden. Hierzu können Algorithmen vor der eigentlichen Programmierung in Ablaufplänen z.B. durch Modelle der [[UML]] oder [[Struktogramm|Struktogramme]] visualisiert werden. Algorithmen werden in der Programmierung durch [[Kontrollstruktur|Kontrollstrukturen]] oder [[Rekursion]] implementiert.&lt;br /&gt;
[[Datei:Übersicht Algorithmus.png|mini]]&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
&lt;br /&gt;
Ein Algorithmus in der Informatik ist die Beschreibung eines Verfahrens, um aus gewissen Eingabegrößen bestimmte Ausgabegrößen zu bestimmen. Hierfür müssen folgende Bedingungen erfüllt sein:&lt;br /&gt;
&lt;br /&gt;
=== Spezifikation ===&lt;br /&gt;
&lt;br /&gt;
Für Algorithmen werden Schnittstellenspezifikationen benötigt. Sie regeln die Ein- und Ausgabe des Algorithmus. In der [https://de.wikipedia.org/wiki/Java_(Programmiersprache) Java] Programmierung werden Algorithmen mit [[Methode|Methoden]] realisiert. Die Schnittstelle der Methoden muss in der so genannten [[Methodensignatur|Signatur]] beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
==== Eingabespezifikation ====&lt;br /&gt;
&lt;br /&gt;
Es muss genau spezifiziert sein, welche Eingabegrößen erforderlich sind und welche Anforderungen diesen Größen genügen müssen, damit das Verfahren funktioniert. In der [https://de.wikipedia.org/wiki/Java_(Programmiersprache) Java] Programmierung wird die Eingabespezifikation durch so genannte Eingabeparameter definiert.&lt;br /&gt;
&lt;br /&gt;
==== Ausgabespezifikation ====&lt;br /&gt;
&lt;br /&gt;
Es muss genau spezifiziert sein, welche Ausgabegrößen (Resultate) mit welchen Eigenschaften bestimmt werden. In der [https://de.wikipedia.org/wiki/Java_(Programmiersprache) Java] Programmierung wird die Ausgabespezifikation durch den so genannten Ausgabeparameter definiert.&lt;br /&gt;
&lt;br /&gt;
=== Durchführbarkeit ===&lt;br /&gt;
&lt;br /&gt;
==== Endliche Beschreibung ====&lt;br /&gt;
&lt;br /&gt;
Das Verfahren muss mit einem endlichen Text beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
==== Effektivität ====&lt;br /&gt;
&lt;br /&gt;
Jeder Schritt des Verfahrens muss tatsächlich durchführbar sein.&lt;br /&gt;
&lt;br /&gt;
==== Determinismus und Determiniertheit ====&lt;br /&gt;
&lt;br /&gt;
Wenn der Ablauf zu jedem Zeitpunkt fest vorgeschrieben ist, ist der Algorithmus deterministisch (Determinismus). Für zwei gleiche Eingabegrößen werden jedes Mal exakt die gleichen Rechenschritt in der identischen Reihenfolge durchlaufen. Jeder deterministische Algorithmus ist auch determiniert (Determiniertheit). Der Algorithmus ist determiniert, wenn dieser stets für die gleiche Eingabegröße die gleiche Ausgabegröße liefert! Aber ein determinierter Algorithmus, muss nicht deterministisch sein. Denn determinierte Algorithmen können für gleiche Eingabegrößen jedes Mal auf unterschiedlichen Wegen zum Ziel kommen; liefern aber jedes Mal das gleiche Ergebnis!&lt;br /&gt;
&lt;br /&gt;
=== Korrektheit ===&lt;br /&gt;
&lt;br /&gt;
==== Partielle Korrektheit ====&lt;br /&gt;
&lt;br /&gt;
Jedes ermittelte Ergebnis genügt der Ausgabespezifikation, sofern die Eingaben der Eingabespezifikation genügen.&lt;br /&gt;
&lt;br /&gt;
==== Terminierung ====&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus hält nach endlichen vielen Schritten an, sofern die Eingabe der Eingabespezifikation genügen.&lt;br /&gt;
&lt;br /&gt;
=== Effizienz ===&lt;br /&gt;
&lt;br /&gt;
Außerdem sollte der Algorithmus effizient arbeiten. D.h. er sollte nicht zu viel Rechenleistung des Prozessors binden, um die Ausführungszeit nicht unnötig zu verlängern. Dies wird vermieden indem zur Laufzeit eine möglichst minimale Anzahl an Befehlen abgearbeitet werden muss, um das gegebene Problem zu lösen.&lt;br /&gt;
&lt;br /&gt;
==== Laufzeit ====&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Schritte, die ein Algorithmus benötigt, wird als die [[Laufzeit]] des Algorithmus bezeichnet. Der Begriff Schritt bezieht sich auf das zugrunde gelegte Maschinenmodell. Die Maschine (der Computer) muss in der Lage sein, einen einzelnen Schritt in konstanter Zeit auszuführen. Die Laufzeit hängt im allgemeinen von der Eingabe ab, insbesondere von der Länge der Eingabe, die auch als Problemgröße bezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Die [[Laufzeitanalyse|Laufzeit]] eines [[Sortieren|Sortieralgorithmus]] ist umso größer, je mehr Elemente zu sortieren sind. Soll eine Liste von fünf Zahlen sortiert werden, so ist die Problemgröße n=5.&lt;br /&gt;
&lt;br /&gt;
Bei einer vorsortierten Eingabefolge benötigt der Algorithmus möglicherweise weniger Schritte als bei einer unsortierten Eingabefolge gleicher Länge. Eine vorsortierte Liste stellt das Best Case Szenario dar. Also den günstigsten Fall für das gegebene Problem (hier das Sortieren von Zahlen). Eine sortierte Liste in umgekehrter Reihenfolge stellt das Worst Case Szenario dar. Hier ist der Aufwand am größten die Liste umzusortieren.&lt;br /&gt;
&lt;br /&gt;
Um den Algorithmus unabhängig von der konkreten Eingabe bewerten zu können, betrachtet man die Zeitkomplexität in der so genannten [[Laufzeitanalyse]].&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt einen Algorithmus in der Programmiersprache [[Java]] der z.B. Bücher in einem Regal sortiert:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot; line&amp;gt;&lt;br /&gt;
// Sortieren durch Vertauschen unmittelbarer Nachbarn&lt;br /&gt;
&lt;br /&gt;
// beim ersten Durchgang &amp;quot;perlt&amp;quot; die größte Zahl nach hinten, so dass&lt;br /&gt;
&lt;br /&gt;
// spätere Durtchgänge immer ein Element früher enden können und so&lt;br /&gt;
&lt;br /&gt;
// der sortierte Teil von hinten nach vorne wächst&lt;br /&gt;
int durchgang, stelle;&lt;br /&gt;
for (durchgang=1; durchgang&amp;lt;reihung.length; durchgang++){&lt;br /&gt;
&lt;br /&gt;
    // Es werden alle zu durchsuchenden Elemente Schritt für Schritt durchlaufen&lt;br /&gt;
    for (stelle=0; stelle&amp;lt;reihung.length-durchgang; stelle++){&lt;br /&gt;
    // Durchgänge beginnen immer bei 0, enden aber immer früher&lt;br /&gt;
        if (reihung[stelle] &amp;gt; reihung[stelle+1]){&lt;br /&gt;
            // Nachbarn in falscher Reihenfolge werden vertauscht&lt;br /&gt;
            tausche (stelle, stelle+1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:AHR_I_Informatik_LK]]&lt;br /&gt;
[[Kategorie:FI_I_SDM]]&lt;br /&gt;
[[Kategorie:FI_I_TP1]]&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Algorithmus&amp;diff=2731</id>
		<title>Algorithmus</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Algorithmus&amp;diff=2731"/>
		<updated>2026-02-20T10:46:16Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Laufzeit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein &#039;&#039;&#039;Algorithmus&#039;&#039;&#039; ist in der Informatik ein genau beschriebenes Verfahren zur Lösung eines gegebenen Problems. Ein &#039;&#039;&#039;Programm&#039;&#039;&#039; stellt die Übersetzung eines Algorithmus in eine vom Computer begreifbare und ausführbare Folge von Befehlen dar, an dessen Ende die Lösung eines Problems ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
Problem --&amp;gt; Algorithmus --&amp;gt; Programm&lt;br /&gt;
&lt;br /&gt;
Somit ist ein Algorithmus universeller als eine konkrete Implementierung.&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
&lt;br /&gt;
Zwei oft zu bewältigende Probleme in der Informatik sind das [[Suchen]] und das [[Sortieren]] von [[Objekt|Objekten]]. Allerdings sind Algorithmen für Computer heute so vielfältig wie die Anwendungen, die sie ermöglichen sollen. Vom elektronischen Steuergerät für den Einsatz in KFZ über die Rechtschreib- und Satzbau-Kontrolle in einer Textverarbeitung bis hin zur Analyse von Aktienmärkten finden sich tausende von mehr oder minder tauglich arbeitenden Algorithmen.&lt;br /&gt;
&lt;br /&gt;
Die Lösung komplexer Probleme sollte zuvor designed werden. Hierzu können Algorithmen vor der eigentlichen Programmierung in Ablaufplänen z.B. durch Modelle der [[UML]] oder [[Struktogramm|Struktogramme]] visualisiert werden. Algorithmen werden in der Programmierung durch [[Kontrollstruktur|Kontrollstrukturen]] oder [[Rekursion]] implementiert.&lt;br /&gt;
[[Datei:Übersicht Algorithmus.png|mini]]&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
&lt;br /&gt;
Ein Algorithmus in der Informatik ist die Beschreibung eines Verfahrens, um aus gewissen Eingabegrößen bestimmte Ausgabegrößen zu bestimmen. Hierfür müssen folgende Bedingungen erfüllt sein:&lt;br /&gt;
&lt;br /&gt;
=== Spezifikation ===&lt;br /&gt;
&lt;br /&gt;
Für Algorithmen werden Schnittstellenspezifikationen benötigt. Sie regeln die Ein- und Ausgabe des Algorithmus. In der [https://de.wikipedia.org/wiki/Java_(Programmiersprache) Java] Programmierung werden Algorithmen mit [[Methode|Methoden]] realisiert. Die Schnittstelle der Methoden muss in der so genannten [[Methodensignatur|Signatur]] beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
==== Eingabespezifikation ====&lt;br /&gt;
&lt;br /&gt;
Es muss genau spezifiziert sein, welche Eingabegrößen erforderlich sind und welche Anforderungen diesen Größen genügen müssen, damit das Verfahren funktioniert. In der [https://de.wikipedia.org/wiki/Java_(Programmiersprache) Java] Programmierung wird die Eingabespezifikation durch so genannte Eingabeparameter definiert.&lt;br /&gt;
&lt;br /&gt;
==== Ausgabespezifikation ====&lt;br /&gt;
&lt;br /&gt;
Es muss genau spezifiziert sein, welche Ausgabegrößen (Resultate) mit welchen Eigenschaften bestimmt werden. In der [https://de.wikipedia.org/wiki/Java_(Programmiersprache) Java] Programmierung wird die Ausgabespezifikation durch den so genannten Ausgabeparameter definiert.&lt;br /&gt;
&lt;br /&gt;
=== Durchführbarkeit ===&lt;br /&gt;
&lt;br /&gt;
==== Endliche Beschreibung ====&lt;br /&gt;
&lt;br /&gt;
Das Verfahren muss mit einem endlichen Text beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
==== Effektivität ====&lt;br /&gt;
&lt;br /&gt;
Jeder Schritt des Verfahrens muss tatsächlich durchführbar sein.&lt;br /&gt;
&lt;br /&gt;
==== Determinismus und Determiniertheit ====&lt;br /&gt;
&lt;br /&gt;
Wenn der Ablauf zu jedem Zeitpunkt fest vorgeschrieben ist, ist der Algorithmus deterministisch (Determinismus). Für zwei gleiche Eingabegrößen werden jedes Mal exakt die gleichen Rechenschritt in der identischen Reihenfolge durchlaufen. Jeder deterministische Algorithmus ist auch determiniert (Determiniertheit). Der Algorithmus ist determiniert, wenn dieser stets für die gleiche Eingabegröße die gleiche Ausgabegröße liefert! Aber ein determinierter Algorithmus, muss nicht deterministisch sein. Denn determinierte Algorithmen können für gleiche Eingabegrößen jedes Mal auf unterschiedlichen Wegen zum Ziel kommen; liefern aber jedes Mal das gleiche Ergebnis!&lt;br /&gt;
&lt;br /&gt;
=== Korrektheit ===&lt;br /&gt;
&lt;br /&gt;
==== Partielle Korrektheit ====&lt;br /&gt;
&lt;br /&gt;
Jedes ermittelte Ergebnis genügt der Ausgabespezifikation, sofern die Eingaben der Eingabespezifikation genügen.&lt;br /&gt;
&lt;br /&gt;
==== Terminierung ====&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus hält nach endlichen vielen Schritten an, sofern die Eingabe der Eingabespezifikation genügen.&lt;br /&gt;
&lt;br /&gt;
=== Effizienz ===&lt;br /&gt;
&lt;br /&gt;
Außerdem sollte der Algorithmus effizient arbeiten. D.h. er sollte nicht zu viel Rechenleistung des Prozessors binden, um die Ausführungszeit nicht unnötig zu verlängern. Dies wird vermieden indem zur Laufzeit eine möglichst minimale Anzahl an Befehlen abgearbeitet werden muss, um das gegebene Problem zu lösen.&lt;br /&gt;
&lt;br /&gt;
==== Laufzeit ====&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der Schritte, die ein Algorithmus benötigt, wird als die [[Laufzeit]] des Algorithmus bezeichnet. Der Begriff Schritt bezieht sich auf das zugrunde gelegte Maschinenmodell. Die Maschine (der Computer) muss in der Lage sein, einen einzelnen Schritt in konstanter Zeit auszuführen. Die Laufzeit hängt im allgemeinen von der Eingabe ab, insbesondere von der Länge der Eingabe, die auch als Problemgröße bezeichnet wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Die [[Laufzeit]] eines [[Sortieralgorithmus]] ist umso größer, je mehr Elemente zu sortieren sind. Soll eine Liste von fünf Zahlen sortiert werden, so ist die Problemgröße n=5.&lt;br /&gt;
&lt;br /&gt;
Bei einer vorsortierten Eingabefolge benötigt der Algorithmus möglicherweise weniger Schritte als bei einer unsortierten Eingabefolge gleicher Länge. Eine vorsortierte Liste stellt das Best Case Szenario dar. Also den günstigsten Fall für das gegebene Problem (hier das Sortieren von Zahlen). Eine sortierte Liste in umgekehrter Reihenfolge stellt das Worst Case Szenario dar. Hier ist der Aufwand am größten die Liste umzusortieren.&lt;br /&gt;
&lt;br /&gt;
Um den Algorithmus unabhängig von der konkreten Eingabe bewerten zu können, betrachtet man die Zeitkomplexität in der so genannten [[Laufzeitanalyse]].&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt einen Algorithmus in der Programmiersprache [[Java]] der z.B. Bücher in einem Regal sortiert:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot; line&amp;gt;&lt;br /&gt;
// Sortieren durch Vertauschen unmittelbarer Nachbarn&lt;br /&gt;
&lt;br /&gt;
// beim ersten Durchgang &amp;quot;perlt&amp;quot; die größte Zahl nach hinten, so dass&lt;br /&gt;
&lt;br /&gt;
// spätere Durtchgänge immer ein Element früher enden können und so&lt;br /&gt;
&lt;br /&gt;
// der sortierte Teil von hinten nach vorne wächst&lt;br /&gt;
int durchgang, stelle;&lt;br /&gt;
for (durchgang=1; durchgang&amp;lt;reihung.length; durchgang++){&lt;br /&gt;
&lt;br /&gt;
    // Es werden alle zu durchsuchenden Elemente Schritt für Schritt durchlaufen&lt;br /&gt;
    for (stelle=0; stelle&amp;lt;reihung.length-durchgang; stelle++){&lt;br /&gt;
    // Durchgänge beginnen immer bei 0, enden aber immer früher&lt;br /&gt;
        if (reihung[stelle] &amp;gt; reihung[stelle+1]){&lt;br /&gt;
            // Nachbarn in falscher Reihenfolge werden vertauscht&lt;br /&gt;
            tausche (stelle, stelle+1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:AHR_I_Informatik_LK]]&lt;br /&gt;
[[Kategorie:FI_I_SDM]]&lt;br /&gt;
[[Kategorie:FI_I_TP1]]&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2730</id>
		<title>Laufzeitanalyse</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2730"/>
		<updated>2026-02-20T10:45:37Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Beispiel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Laufzeitanalyse asymptotisch.png|mini]]&lt;br /&gt;
Die Laufzeitanalyse betrachtet die Zeitkomplexität eines [[Algorithmus]]. Da die Zeit zur Ausführung eines Algorithmuses von der Hardwareausstattung des Zielsystems abhängt, wird für eine allgemeine Betrachtung die Anzahl der [[Anweisung|Befehle]] analysiert, die ein Algorithmus zur Lösung eines gegebenen Problems benötigt. Die Lösung eines Problems mit Hilfe eines gegebenen Algorithmus ist abhängig von der Eingabe.  Die Eingabe wird auch als Problemgröße bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Die Analyse für kleine Eingabemengen ist häufig nicht so bedeutsam, weil für diesen Fall auch schwach konzipierte [[Algorithmus|Algorithmen]] befriedigende Ergebnisse liefern. Wichtiger sind die Betrachtungen für sehr große Problemgrößen und einer ungünstigen Anordnung der Werte (worst-case). Dabei wird von der asymptotischen [[Programmausführung|Laufzeit]] gesprochen und meint damit, in Anlehnung an eine Asymptote, das Zeitverhalten des Algorithmus für eine potenziell unendlich große Eingabemenge. Soll z.B. eine Folge von Zahlen [[Sortieren|sortiert]] werden, dann betrachtet man eine theoretisch unendliche lange Folge von Zahlen.&lt;br /&gt;
&lt;br /&gt;
Lässt sich ein Algorithmus mathematisch durch die Funktion beschreiben, so gilt: &amp;lt;math&amp;gt;f(x)=1/x+x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die rot dargestellte Funktion&amp;lt;math&amp;gt; \color{Red}{f(x) = 1/x + x} &amp;lt;/math&amp;gt;nähert sich für große x der grün dargestellte Asymptote &amp;lt;math&amp;gt; \color{green}{g(x)} &amp;lt;/math&amp;gt; an.&lt;br /&gt;
&lt;br /&gt;
Die Laufzeit wird in Abhängigkeit von der Länge n der Eingabe angegeben und für immer größer werdende n asymptotisch unter Verwendung der Landau-Notation(Groß-O-Notation) abgeschätzt. &lt;br /&gt;
&lt;br /&gt;
In der Praxis ist die Laufzeitanalyse interessant, weil hierdurch entschieden werden kann, ob ein Programm bei anwachsender Eingabemenge wirtschaftlich betrieben werden kann.&lt;br /&gt;
Abgrenzung&lt;br /&gt;
Abgrenzend kann gesagt werden, dass die Laufzeitanalyse folgendes nicht betrachtet:&lt;br /&gt;
&lt;br /&gt;
Den Zeitaufwand eines implementierten Algorithmus auf einem bestimmten Computer für eine konkrete endliche Eingabemenge. &lt;br /&gt;
&lt;br /&gt;
== Szenarien ==&lt;br /&gt;
Man unterscheidet die folgenden Varianten zur Laufzeitabschätzung:&lt;br /&gt;
&lt;br /&gt;
* Das &#039;&#039;&#039;worst-case-szenario&#039;&#039;&#039; (engl. schlechtester Fall) beschreibt die Problemgröße, die zu einer maximal langen Durchlaufzeit eines Algorithmus führt und entspricht der oberen Schranke zur Lösung eines Problems.&lt;br /&gt;
* Das &#039;&#039;&#039;average-case-Szenario&#039;&#039;&#039; (engl. durchschnittlicher Fall) beschreibt die Problemgröße die zu einer mittleren Durchlaufzeit eines Algorithmus führt.&lt;br /&gt;
* Das &#039;&#039;&#039;best-case-Szenario&#039;&#039;&#039; (engl. bester Fall)   beschreibt die Problemgröße die zu einer minimalen Durchlaufzeit eines Algorithmus führt. Dies entspricht der untere Schranke zur Lösung eines Problems.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Im Folgenden wird die Laufzeitanalyse anhand des [[Insertion-sort|Insertionsorts]] praktisch durchgeführt. Wir betrachten den Insertionsort anhand einer möglichen Implementierung in der Programmiersprache [[Java]]. Der [[Algorithmus]] arbeitet mit einem [[Array]] als Datenstruktur und verwendet als [[Kontrollstruktur|Kontrollstrukturen]] [[Verzweigung|Verzweigungen]] und [[Schleife|Schleifen]].&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void sortierenEinfuegen_MC() {&lt;br /&gt;
    int v, i, j;&lt;br /&gt;
    for (i = 1; i &amp;lt; zSortfeld.length; i++) {&lt;br /&gt;
        c++; // Zähler für Vergleiche&lt;br /&gt;
        if (zSortfeld[i] &amp;lt; zSortfeld[i - 1]) {&lt;br /&gt;
            v = zSortfeld[i];&lt;br /&gt;
            j = i;&lt;br /&gt;
            do {&lt;br /&gt;
                zSortfeld[j] = zSortfeld[j - 1];&lt;br /&gt;
                j--;&lt;br /&gt;
            } while ((j &amp;gt; 0) &amp;amp;&amp;amp; (zSortfeld[j - 1] &amp;gt; v));&lt;br /&gt;
            zSortfeld[j] = v; &lt;br /&gt;
        }&lt;br /&gt;
        printAnalyse(i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine sortierte Liste in umgekehrter Reihenfolge ist das Worst Case Szenario für den InsertionSort:&lt;br /&gt;
&lt;br /&gt;
[11,7,5,3,2,0]&lt;br /&gt;
&lt;br /&gt;
Wir betrachten zunächst nur den Zeitverbrauch für die durchzuführenden Vergleichsoperationen. Diesen Zeitverbrauchen kennen wir nicht und geben ihn allgemein durch die Konstante c an. Die Anzahl der zu sortierenden Elemente entspricht der Variablen n. &lt;br /&gt;
&lt;br /&gt;
Beim ersten äußeren [[Schleife]]ndurchlauf gilt für den Zeitaufwand c*1. Denn wir müssen nur die Zahl 7 mit der Zahl 11 vergleichen. 7 wird einsortiert und es bildet sich der bereits sortierte Teil (siehe [[Insertion-sort|InsertionSort]]) der Datenstruktur.  Beim zweiten Durchlauf der äußeren [[Schleife]] benötigen wir zwei Vergleiche, c * 2. Beim dritte Mal, c * 3 bis zum letzten Mal, wenn &amp;lt;math&amp;gt; c * n-1 &amp;lt;/math&amp;gt;. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅*(1+2+3+⋯+(n−1))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Asymptote an quadratische Funktion2.png|mini]]&lt;br /&gt;
Hierbei handelt es sich um eine [[Arithmetische-reihe|arithmetische Reihe]], mit der Ausnahme, dass sie bis zu n-1 anstatt n ansteigt. Unter Verwendung unserer Formel für arithmetische Reihen, erhalten wir:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅*(n−1+1)*((n−1)/2)=c*n​2​​/2 − c*n/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für sehr große n können  wir den niederwertigen Term n/2  und die konstanten Faktoren c und  1/2 verwerfen, so dass gilt:&lt;br /&gt;
&lt;br /&gt;
Für sehr große n verhält sich &amp;lt;math&amp;gt; C(n)&amp;lt;/math&amp;gt; asymptotisch wie n2. Oder anders ausgedrückt &amp;lt;math&amp;gt; C(n)&amp;lt;/math&amp;gt; liegt in der Klasse &amp;lt;math&amp;gt;O(n2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Und wie beeinflussen die anderen Operationen wie Lesen und Schreiben, die zum Vertauschen der Werte benötigt werden die Zeitkomplexität? Für das Vertauschen der Werte würde nur ein konstanter Aufwand je Vergleich hinzukommen. Wir nennen ihn v und passen unsere Funktion entsprechend an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(v+c) * n​2​​/2 − (v+c)* n/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und wieder gilt, für sehr große n können wir den niederwertigen Term &amp;lt;math&amp;gt;(v+c)* n/2 &amp;lt;/math&amp;gt;und die konstanten Faktoren v,c und 1/2 verwerfen, so dass immer noch gilt:&lt;br /&gt;
&lt;br /&gt;
Für sehr große n verhält sich &amp;lt;math&amp;gt;C(n) &amp;lt;/math&amp;gt;asymptotisch wie n2. Oder anders ausgedrückt &amp;lt;math&amp;gt;C(n) &amp;lt;/math&amp;gt;liegt in der Klasse &amp;lt;math&amp;gt;O(n2)&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Datei:Asymptote_an_quadratische_Funktion2.png&amp;diff=2729</id>
		<title>Datei:Asymptote an quadratische Funktion2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Datei:Asymptote_an_quadratische_Funktion2.png&amp;diff=2729"/>
		<updated>2026-02-20T10:45:29Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Asymptote an quadratische Funktion&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2728</id>
		<title>Laufzeitanalyse</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2728"/>
		<updated>2026-02-20T10:44:10Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Beispiel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Laufzeitanalyse asymptotisch.png|mini]]&lt;br /&gt;
Die Laufzeitanalyse betrachtet die Zeitkomplexität eines [[Algorithmus]]. Da die Zeit zur Ausführung eines Algorithmuses von der Hardwareausstattung des Zielsystems abhängt, wird für eine allgemeine Betrachtung die Anzahl der [[Anweisung|Befehle]] analysiert, die ein Algorithmus zur Lösung eines gegebenen Problems benötigt. Die Lösung eines Problems mit Hilfe eines gegebenen Algorithmus ist abhängig von der Eingabe.  Die Eingabe wird auch als Problemgröße bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Die Analyse für kleine Eingabemengen ist häufig nicht so bedeutsam, weil für diesen Fall auch schwach konzipierte [[Algorithmus|Algorithmen]] befriedigende Ergebnisse liefern. Wichtiger sind die Betrachtungen für sehr große Problemgrößen und einer ungünstigen Anordnung der Werte (worst-case). Dabei wird von der asymptotischen [[Programmausführung|Laufzeit]] gesprochen und meint damit, in Anlehnung an eine Asymptote, das Zeitverhalten des Algorithmus für eine potenziell unendlich große Eingabemenge. Soll z.B. eine Folge von Zahlen [[Sortieren|sortiert]] werden, dann betrachtet man eine theoretisch unendliche lange Folge von Zahlen.&lt;br /&gt;
&lt;br /&gt;
Lässt sich ein Algorithmus mathematisch durch die Funktion beschreiben, so gilt: &amp;lt;math&amp;gt;f(x)=1/x+x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die rot dargestellte Funktion&amp;lt;math&amp;gt; \color{Red}{f(x) = 1/x + x} &amp;lt;/math&amp;gt;nähert sich für große x der grün dargestellte Asymptote &amp;lt;math&amp;gt; \color{green}{g(x)} &amp;lt;/math&amp;gt; an.&lt;br /&gt;
&lt;br /&gt;
Die Laufzeit wird in Abhängigkeit von der Länge n der Eingabe angegeben und für immer größer werdende n asymptotisch unter Verwendung der Landau-Notation(Groß-O-Notation) abgeschätzt. &lt;br /&gt;
&lt;br /&gt;
In der Praxis ist die Laufzeitanalyse interessant, weil hierdurch entschieden werden kann, ob ein Programm bei anwachsender Eingabemenge wirtschaftlich betrieben werden kann.&lt;br /&gt;
Abgrenzung&lt;br /&gt;
Abgrenzend kann gesagt werden, dass die Laufzeitanalyse folgendes nicht betrachtet:&lt;br /&gt;
&lt;br /&gt;
Den Zeitaufwand eines implementierten Algorithmus auf einem bestimmten Computer für eine konkrete endliche Eingabemenge. &lt;br /&gt;
&lt;br /&gt;
== Szenarien ==&lt;br /&gt;
Man unterscheidet die folgenden Varianten zur Laufzeitabschätzung:&lt;br /&gt;
&lt;br /&gt;
* Das &#039;&#039;&#039;worst-case-szenario&#039;&#039;&#039; (engl. schlechtester Fall) beschreibt die Problemgröße, die zu einer maximal langen Durchlaufzeit eines Algorithmus führt und entspricht der oberen Schranke zur Lösung eines Problems.&lt;br /&gt;
* Das &#039;&#039;&#039;average-case-Szenario&#039;&#039;&#039; (engl. durchschnittlicher Fall) beschreibt die Problemgröße die zu einer mittleren Durchlaufzeit eines Algorithmus führt.&lt;br /&gt;
* Das &#039;&#039;&#039;best-case-Szenario&#039;&#039;&#039; (engl. bester Fall)   beschreibt die Problemgröße die zu einer minimalen Durchlaufzeit eines Algorithmus führt. Dies entspricht der untere Schranke zur Lösung eines Problems.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Im Folgenden wird die Laufzeitanalyse anhand des [[Insertion-sort|Insertionsorts]] praktisch durchgeführt. Wir betrachten den Insertionsort anhand einer möglichen Implementierung in der Programmiersprache [[Java]]. Der [[Algorithmus]] arbeitet mit einem [[Array]] als Datenstruktur und verwendet als [[Kontrollstruktur|Kontrollstrukturen]] [[Verzweigung|Verzweigungen]] und [[Schleife|Schleifen]].&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void sortierenEinfuegen_MC() {&lt;br /&gt;
    int v, i, j;&lt;br /&gt;
    for (i = 1; i &amp;lt; zSortfeld.length; i++) {&lt;br /&gt;
        c++; // Zähler für Vergleiche&lt;br /&gt;
        if (zSortfeld[i] &amp;lt; zSortfeld[i - 1]) {&lt;br /&gt;
            v = zSortfeld[i];&lt;br /&gt;
            j = i;&lt;br /&gt;
            do {&lt;br /&gt;
                zSortfeld[j] = zSortfeld[j - 1];&lt;br /&gt;
                j--;&lt;br /&gt;
            } while ((j &amp;gt; 0) &amp;amp;&amp;amp; (zSortfeld[j - 1] &amp;gt; v));&lt;br /&gt;
            zSortfeld[j] = v; &lt;br /&gt;
        }&lt;br /&gt;
        printAnalyse(i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine sortierte Liste in umgekehrter Reihenfolge ist das Worst Case Szenario für den InsertionSort:&lt;br /&gt;
&lt;br /&gt;
[11,7,5,3,2,0]&lt;br /&gt;
&lt;br /&gt;
Wir betrachten zunächst nur den Zeitverbrauch für die durchzuführenden Vergleichsoperationen. Diesen Zeitverbrauchen kennen wir nicht und geben ihn allgemein durch die Konstante c an. Die Anzahl der zu sortierenden Elemente entspricht der Variablen n. &lt;br /&gt;
&lt;br /&gt;
Beim ersten äußeren [[Schleife]]ndurchlauf gilt für den Zeitaufwand c*1. Denn wir müssen nur die Zahl 7 mit der Zahl 11 vergleichen. 7 wird einsortiert und es bildet sich der bereits sortierte Teil (siehe [[Insertion-sort|InsertionSort]]) der Datenstruktur.  Beim zweiten Durchlauf der äußeren [[Schleife]] benötigen wir zwei Vergleiche, c * 2. Beim dritte Mal, c * 3 bis zum letzten Mal, wenn &amp;lt;math&amp;gt; c * n-1 &amp;lt;/math&amp;gt;. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅*(1+2+3+⋯+(n−1))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Asymptote an quadratische Funktion.png|mini]]&lt;br /&gt;
Hierbei handelt es sich um eine [[Arithmetische-reihe|arithmetische Reihe]], mit der Ausnahme, dass sie bis zu n-1 anstatt n ansteigt. Unter Verwendung unserer Formel für arithmetische Reihen, erhalten wir:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅*(n−1+1)*((n−1)/2)=c*n​2​​/2 − c*n/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für sehr große n können  wir den niederwertigen Term n/2  und die konstanten Faktoren c und  1/2 verwerfen, so dass gilt:&lt;br /&gt;
&lt;br /&gt;
Für sehr große n verhält sich &amp;lt;math&amp;gt; C(n)&amp;lt;/math&amp;gt; asymptotisch wie n2. Oder anders ausgedrückt &amp;lt;math&amp;gt; C(n)&amp;lt;/math&amp;gt; liegt in der Klasse &amp;lt;math&amp;gt;O(n2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Und wie beeinflussen die anderen Operationen wie Lesen und Schreiben, die zum Vertauschen der Werte benötigt werden die Zeitkomplexität? Für das Vertauschen der Werte würde nur ein konstanter Aufwand je Vergleich hinzukommen. Wir nennen ihn v und passen unsere Funktion entsprechend an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(v+c) * n​2​​/2 − (v+c)* n/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und wieder gilt, für sehr große n können wir den niederwertigen Term &amp;lt;math&amp;gt;(v+c)* n/2 &amp;lt;/math&amp;gt;und die konstanten Faktoren v,c und 1/2 verwerfen, so dass immer noch gilt:&lt;br /&gt;
&lt;br /&gt;
Für sehr große n verhält sich &amp;lt;math&amp;gt;C(n) &amp;lt;/math&amp;gt;asymptotisch wie n2. Oder anders ausgedrückt &amp;lt;math&amp;gt;C(n) &amp;lt;/math&amp;gt;liegt in der Klasse &amp;lt;math&amp;gt;O(n2)&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Datei:Asymptote_an_quadratische_Funktion.png&amp;diff=2727</id>
		<title>Datei:Asymptote an quadratische Funktion.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Datei:Asymptote_an_quadratische_Funktion.png&amp;diff=2727"/>
		<updated>2026-02-20T10:43:52Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Asymptote an quadratische Funktion&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2726</id>
		<title>Laufzeitanalyse</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2726"/>
		<updated>2026-02-20T10:42:48Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Beispiel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Laufzeitanalyse asymptotisch.png|mini]]&lt;br /&gt;
Die Laufzeitanalyse betrachtet die Zeitkomplexität eines [[Algorithmus]]. Da die Zeit zur Ausführung eines Algorithmuses von der Hardwareausstattung des Zielsystems abhängt, wird für eine allgemeine Betrachtung die Anzahl der [[Anweisung|Befehle]] analysiert, die ein Algorithmus zur Lösung eines gegebenen Problems benötigt. Die Lösung eines Problems mit Hilfe eines gegebenen Algorithmus ist abhängig von der Eingabe.  Die Eingabe wird auch als Problemgröße bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Die Analyse für kleine Eingabemengen ist häufig nicht so bedeutsam, weil für diesen Fall auch schwach konzipierte [[Algorithmus|Algorithmen]] befriedigende Ergebnisse liefern. Wichtiger sind die Betrachtungen für sehr große Problemgrößen und einer ungünstigen Anordnung der Werte (worst-case). Dabei wird von der asymptotischen [[Programmausführung|Laufzeit]] gesprochen und meint damit, in Anlehnung an eine Asymptote, das Zeitverhalten des Algorithmus für eine potenziell unendlich große Eingabemenge. Soll z.B. eine Folge von Zahlen [[Sortieren|sortiert]] werden, dann betrachtet man eine theoretisch unendliche lange Folge von Zahlen.&lt;br /&gt;
&lt;br /&gt;
Lässt sich ein Algorithmus mathematisch durch die Funktion beschreiben, so gilt: &amp;lt;math&amp;gt;f(x)=1/x+x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die rot dargestellte Funktion&amp;lt;math&amp;gt; \color{Red}{f(x) = 1/x + x} &amp;lt;/math&amp;gt;nähert sich für große x der grün dargestellte Asymptote &amp;lt;math&amp;gt; \color{green}{g(x)} &amp;lt;/math&amp;gt; an.&lt;br /&gt;
&lt;br /&gt;
Die Laufzeit wird in Abhängigkeit von der Länge n der Eingabe angegeben und für immer größer werdende n asymptotisch unter Verwendung der Landau-Notation(Groß-O-Notation) abgeschätzt. &lt;br /&gt;
&lt;br /&gt;
In der Praxis ist die Laufzeitanalyse interessant, weil hierdurch entschieden werden kann, ob ein Programm bei anwachsender Eingabemenge wirtschaftlich betrieben werden kann.&lt;br /&gt;
Abgrenzung&lt;br /&gt;
Abgrenzend kann gesagt werden, dass die Laufzeitanalyse folgendes nicht betrachtet:&lt;br /&gt;
&lt;br /&gt;
Den Zeitaufwand eines implementierten Algorithmus auf einem bestimmten Computer für eine konkrete endliche Eingabemenge. &lt;br /&gt;
&lt;br /&gt;
== Szenarien ==&lt;br /&gt;
Man unterscheidet die folgenden Varianten zur Laufzeitabschätzung:&lt;br /&gt;
&lt;br /&gt;
* Das &#039;&#039;&#039;worst-case-szenario&#039;&#039;&#039; (engl. schlechtester Fall) beschreibt die Problemgröße, die zu einer maximal langen Durchlaufzeit eines Algorithmus führt und entspricht der oberen Schranke zur Lösung eines Problems.&lt;br /&gt;
* Das &#039;&#039;&#039;average-case-Szenario&#039;&#039;&#039; (engl. durchschnittlicher Fall) beschreibt die Problemgröße die zu einer mittleren Durchlaufzeit eines Algorithmus führt.&lt;br /&gt;
* Das &#039;&#039;&#039;best-case-Szenario&#039;&#039;&#039; (engl. bester Fall)   beschreibt die Problemgröße die zu einer minimalen Durchlaufzeit eines Algorithmus führt. Dies entspricht der untere Schranke zur Lösung eines Problems.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Im Folgenden wird die Laufzeitanalyse anhand des [[Insertion-sort|Insertionsorts]] praktisch durchgeführt. Wir betrachten den Insertionsort anhand einer möglichen Implementierung in der Programmiersprache [[Java]]. Der [[Algorithmus]] arbeitet mit einem [[Array]] als Datenstruktur und verwendet als [[Kontrollstruktur|Kontrollstrukturen]] [[Verzweigung|Verzweigungen]] und [[Schleife|Schleifen]].&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void sortierenEinfuegen_MC() {&lt;br /&gt;
    int v, i, j;&lt;br /&gt;
    for (i = 1; i &amp;lt; zSortfeld.length; i++) {&lt;br /&gt;
        c++; // Zähler für Vergleiche&lt;br /&gt;
        if (zSortfeld[i] &amp;lt; zSortfeld[i - 1]) {&lt;br /&gt;
            v = zSortfeld[i];&lt;br /&gt;
            j = i;&lt;br /&gt;
            do {&lt;br /&gt;
                zSortfeld[j] = zSortfeld[j - 1];&lt;br /&gt;
                j--;&lt;br /&gt;
            } while ((j &amp;gt; 0) &amp;amp;&amp;amp; (zSortfeld[j - 1] &amp;gt; v));&lt;br /&gt;
            zSortfeld[j] = v; &lt;br /&gt;
        }&lt;br /&gt;
        printAnalyse(i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine sortierte Liste in umgekehrter Reihenfolge ist das Worst Case Szenario für den InsertionSort:&lt;br /&gt;
&lt;br /&gt;
[11,7,5,3,2,0]&lt;br /&gt;
&lt;br /&gt;
Wir betrachten zunächst nur den Zeitverbrauch für die durchzuführenden Vergleichsoperationen. Diesen Zeitverbrauchen kennen wir nicht und geben ihn allgemein durch die Konstante c an. Die Anzahl der zu sortierenden Elemente entspricht der Variablen n. &lt;br /&gt;
&lt;br /&gt;
Beim ersten äußeren [[Schleife]]ndurchlauf gilt für den Zeitaufwand c*1. Denn wir müssen nur die Zahl 7 mit der Zahl 11 vergleichen. 7 wird einsortiert und es bildet sich der bereits sortierte Teil (siehe [[Insertion-sort|InsertionSort]]) der Datenstruktur.  Beim zweiten Durchlauf der äußeren [[Schleife]] benötigen wir zwei Vergleiche, c * 2. Beim dritte Mal, c * 3 bis zum letzten Mal, wenn &amp;lt;math&amp;gt; c * n-1 &amp;lt;/math&amp;gt;. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅*(1+2+3+⋯+(n−1))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um eine [[Arithmetische-reihe|arithmetische Reihe]], mit der Ausnahme, dass sie bis zu n-1 anstatt n ansteigt. Unter Verwendung unserer Formel für arithmetische Reihen, erhalten wir:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅*(n−1+1)*((n−1)/2)=c*n​2​​/2 − c*n/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für sehr große n können  wir den niederwertigen Term n/2  und die konstanten Faktoren c und  1/2 verwerfen, so dass gilt:&lt;br /&gt;
&lt;br /&gt;
Für sehr große n verhält sich &amp;lt;math&amp;gt; C(n)&amp;lt;/math&amp;gt; asymptotisch wie n2. Oder anders ausgedrückt &amp;lt;math&amp;gt; C(n)&amp;lt;/math&amp;gt; liegt in der Klasse &amp;lt;math&amp;gt;O(n2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Und wie beeinflussen die anderen Operationen wie Lesen und Schreiben, die zum Vertauschen der Werte benötigt werden die Zeitkomplexität? Für das Vertauschen der Werte würde nur ein konstanter Aufwand je Vergleich hinzukommen. Wir nennen ihn v und passen unsere Funktion entsprechend an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(v+c) * n​2​​/2 − (v+c)* n/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und wieder gilt, für sehr große n können wir den niederwertigen Term &amp;lt;math&amp;gt;(v+c)* n/2 &amp;lt;/math&amp;gt;und die konstanten Faktoren v,c und 1/2 verwerfen, so dass immer noch gilt:&lt;br /&gt;
&lt;br /&gt;
Für sehr große n verhält sich &amp;lt;math&amp;gt;C(n) &amp;lt;/math&amp;gt;asymptotisch wie n2. Oder anders ausgedrückt &amp;lt;math&amp;gt;C(n) &amp;lt;/math&amp;gt;liegt in der Klasse &amp;lt;math&amp;gt;O(n2)&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2725</id>
		<title>Laufzeitanalyse</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2725"/>
		<updated>2026-02-20T10:34:19Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Laufzeitanalyse asymptotisch.png|mini]]&lt;br /&gt;
Die Laufzeitanalyse betrachtet die Zeitkomplexität eines [[Algorithmus]]. Da die Zeit zur Ausführung eines Algorithmuses von der Hardwareausstattung des Zielsystems abhängt, wird für eine allgemeine Betrachtung die Anzahl der [[Anweisung|Befehle]] analysiert, die ein Algorithmus zur Lösung eines gegebenen Problems benötigt. Die Lösung eines Problems mit Hilfe eines gegebenen Algorithmus ist abhängig von der Eingabe.  Die Eingabe wird auch als Problemgröße bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Die Analyse für kleine Eingabemengen ist häufig nicht so bedeutsam, weil für diesen Fall auch schwach konzipierte [[Algorithmus|Algorithmen]] befriedigende Ergebnisse liefern. Wichtiger sind die Betrachtungen für sehr große Problemgrößen und einer ungünstigen Anordnung der Werte (worst-case). Dabei wird von der asymptotischen [[Programmausführung|Laufzeit]] gesprochen und meint damit, in Anlehnung an eine Asymptote, das Zeitverhalten des Algorithmus für eine potenziell unendlich große Eingabemenge. Soll z.B. eine Folge von Zahlen [[Sortieren|sortiert]] werden, dann betrachtet man eine theoretisch unendliche lange Folge von Zahlen.&lt;br /&gt;
&lt;br /&gt;
Lässt sich ein Algorithmus mathematisch durch die Funktion beschreiben, so gilt: &amp;lt;math&amp;gt;f(x)=1/x+x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die rot dargestellte Funktion&amp;lt;math&amp;gt; \color{Red}{f(x) = 1/x + x} &amp;lt;/math&amp;gt;nähert sich für große x der grün dargestellte Asymptote &amp;lt;math&amp;gt; \color{green}{g(x)} &amp;lt;/math&amp;gt; an.&lt;br /&gt;
&lt;br /&gt;
Die Laufzeit wird in Abhängigkeit von der Länge n der Eingabe angegeben und für immer größer werdende n asymptotisch unter Verwendung der Landau-Notation(Groß-O-Notation) abgeschätzt. &lt;br /&gt;
&lt;br /&gt;
In der Praxis ist die Laufzeitanalyse interessant, weil hierdurch entschieden werden kann, ob ein Programm bei anwachsender Eingabemenge wirtschaftlich betrieben werden kann.&lt;br /&gt;
Abgrenzung&lt;br /&gt;
Abgrenzend kann gesagt werden, dass die Laufzeitanalyse folgendes nicht betrachtet:&lt;br /&gt;
&lt;br /&gt;
Den Zeitaufwand eines implementierten Algorithmus auf einem bestimmten Computer für eine konkrete endliche Eingabemenge. &lt;br /&gt;
&lt;br /&gt;
== Szenarien ==&lt;br /&gt;
Man unterscheidet die folgenden Varianten zur Laufzeitabschätzung:&lt;br /&gt;
&lt;br /&gt;
* Das &#039;&#039;&#039;worst-case-szenario&#039;&#039;&#039; (engl. schlechtester Fall) beschreibt die Problemgröße, die zu einer maximal langen Durchlaufzeit eines Algorithmus führt und entspricht der oberen Schranke zur Lösung eines Problems.&lt;br /&gt;
* Das &#039;&#039;&#039;average-case-Szenario&#039;&#039;&#039; (engl. durchschnittlicher Fall) beschreibt die Problemgröße die zu einer mittleren Durchlaufzeit eines Algorithmus führt.&lt;br /&gt;
* Das &#039;&#039;&#039;best-case-Szenario&#039;&#039;&#039; (engl. bester Fall)   beschreibt die Problemgröße die zu einer minimalen Durchlaufzeit eines Algorithmus führt. Dies entspricht der untere Schranke zur Lösung eines Problems.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Im Folgenden wird die Laufzeitanalyse anhand des [[Insertion-sort|Insertionsorts]] praktisch durchgeführt. Wir betrachten den Insertionsort anhand einer möglichen Implementierung in der Programmiersprache [[Java]]. Der [[Algorithmus]] arbeitet mit einem [[Array]] als Datenstruktur und verwendet als [[Kontrollstruktur|Kontrollstrukturen]] [[Verzweigung|Verzweigungen]] und [[Schleife|Schleifen]].&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Datei:Laufzeitanalyse_asymptotisch.png&amp;diff=2724</id>
		<title>Datei:Laufzeitanalyse asymptotisch.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Datei:Laufzeitanalyse_asymptotisch.png&amp;diff=2724"/>
		<updated>2026-02-20T09:48:01Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Laufzeitanalyse asymptotisch&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2723</id>
		<title>Quicksort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2723"/>
		<updated>2026-02-20T09:46:42Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Worst-Case */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Rekursive Baumstruktur.jpg|mini]]&lt;br /&gt;
Ein oft eingesetzter [[Sortieren|Sortier]]-Algorithmus ist der Quicksort. Der Quicksort funktioniert nach dem Prinzip »teile und herrsche«, was mit Hilfe der [[Rekursion]] realisiert wird. Die zu sortierenden [[Daten]] werden immer in zwei Teile zerlegt (&amp;quot;Teile&amp;quot;) und wieder sortiert (&amp;quot;Herrsche&amp;quot;)). Diese zwei Teile werden wiederum jeweils in zwei Teile zerlegt und sortiert usw., bis die Daten sortiert sind. Die [[Rekursion]] beendet sich, wenn das Teilstück aus nur noch einem Element besteht (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm#mj035bded10a26be556df779f234784e89).&lt;br /&gt;
&lt;br /&gt;
Die Zerlegung in zwei Teile erfolgt anhand eines sogenannten Pivot-Elementes. Ein Element der Liste wird als Pivot Element ausgewählt und dann werden alle weiteren Elemente der zu sortierenden Liste mit diesem Element verglichen. Die zu sortierende Liste wird in zwei Bereiche unterteilt. Alle Elemente die kleiner sind als das Pivot-Element werden links von dem Pivot-Element einsortiert. Alle Elemente die größer sind, werden rechts von Pivot-Element abgelegt.&lt;br /&gt;
&lt;br /&gt;
Die Elemente, die gleich dem Pivotelement sind, können sich beliebig auf die Teillisten verteilen. Nach der Aufteilung sind die Elemente der linken Liste kleiner oder gleich dem Pivot-Element und somit auch kleiner oder gleich den Elementen der rechten Liste. Die Elemente der linken und rechten Liste sind je Liste noch unsortiert.&lt;br /&gt;
&lt;br /&gt;
Anschließend muss man noch jede Teilliste in sich sortieren, um die Sortierung zu vollenden. Dazu wird der Quicksort-Algorithmus jeweils auf der linken und auf der rechten Teilliste ausgeführt. Jede Teilliste wird dann wieder in zwei Teillisten aufgeteilt und auf diese jeweils wieder der Quicksort-Algorithmus angewandt, und so fort.&lt;br /&gt;
&lt;br /&gt;
Die Teillisten sind immer Abschnitte auf der ursprünglichen Liste, so dass kein zusätzlicher Speicher benötigt wird. &lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Als Beispiel betrachten wir eine Liste mit Zahlen. Wir wählen immer das erste Element als Pivot-Element. Zu Beginn ist die Zahl 7  zufällig das Pivot-Element.&lt;br /&gt;
&lt;br /&gt;
7 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;10 8&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;11&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;3 1 5 2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zahlen, die kleiner als das Pivot-Element 7 sind, wurden blau markiert. Die Zahlen größer 7 haben sind rot markiert. Als ersten Schritt ändert QuickSort die Liste folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; 1 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun sind alle Zahlen, welche kleiner sind als 7, links von ihr. Alle Zahlen welche größer sind als die 7, stehen rechts. Die Reihenfolge der Zahlen in den Teillisten ist hier willkürlich und hängt ab von der jeweiligen Implementierung. Entscheidend ist, dass alle Zahlen die kleiner sind als 7 links stehen und alle Zahlen die größer sind als 7 rechts.&lt;br /&gt;
&lt;br /&gt;
Als nächstes wird der Teil links von der 7 wieder per QuickSort sortiert. Als Pivot wird die Zahl 3 gewählt.  Die Zahlen die kleiner sind als 3 werden wieder blau markiert. Alle Zahlen größer 3 sind rot. Die Zahl 7 und die größeren Zahlen betrachten wir im Moment nicht, deshalb sind sie gelb hinterlegt:&lt;br /&gt;
&lt;br /&gt;
 3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus bringt die blauen und die roten Zahlen wieder in die richtige Ordnung. Man erhält dann das Folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1 2&amp;lt;/span&amp;gt; 3 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;6 5 4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Das wird fortgesetzt bis der linke Teil des Arrays sortiert ist. Das sieht dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;&#039;&#039;1  2  3  4  5  6&#039;&#039;&#039;&#039;&#039;  7  9 11  8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun wird rechts von der 7 sortiert. Wieder wird ein Pivot gewählt, hier die 9, und die kleineren und größeren Zahlen auf die jeweils richtige Seite gebracht.&lt;br /&gt;
&lt;br /&gt;
Der grundsätzlichen Algorithmus lässt mit PseudoCode wie folgt beschreiben:&lt;br /&gt;
&lt;br /&gt;
== Pseudocode ==&lt;br /&gt;
Der folgende Pseudocode illustriert die Arbeitsweise des [[Algorithmus]]. Bei jedem Aufruf von quicksort(...) gibt links den Index des ersten Elements in der Teilliste an und rechts den des letzten. Beim ersten Aufruf (oberste Rekursionsebene) ist links = 0 und rechts = n-1. Die übergebene Liste wird dabei [[Rekursion|rekursiv]] immer weiter geteilt, bis sie nur noch einen Wert enthält.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
funktion quicksort(links, rechts) &lt;br /&gt;
    falls links &amp;lt; rechts dann &lt;br /&gt;
        teiler := teile(links, rechts) &lt;br /&gt;
        quicksort(links, teiler - 1) &lt;br /&gt;
        quicksort(teiler + 1, rechts) &lt;br /&gt;
    ende&lt;br /&gt;
ende&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wahl des Pivot-Elements ==&lt;br /&gt;
Die Wahl des Pivotelements ist wichtig. Die schlechteste Wahl des Pivots ist das Element, welches ganz am linken oder ganz am rechten Rand des zu sortierenden Intervalls endet. Mit linkem oder rechten Element ist nicht das Element gemeint, welches sich in der unsortierten Liste ganz Links (im Beispiel die 7) oder rechts befindet, sondern das kleinste (im Beispiel die 1) bzw. das größte Element (im Beispiel die 12). Der QuickSort ist dann am Effizientesten, wenn man ein Pivot-Element wählt, welches am Schluss genau in der Mitte zu liegen kommt (im Beispiel die 6 oder die 7). Leider ist dieses Element nicht ganz einfach zu finden.&lt;br /&gt;
&lt;br /&gt;
Man sollte deshalb nicht immer wie im Beispiel das erste Element als Pivot wählen. Dies ist zwar leicht zu implementieren, allerdings führt dies zu einem langsamen &amp;quot;QuickSort&amp;quot;, falls  das Array bereits sortiert ist, oder nahezu sortiert ist.&lt;br /&gt;
&lt;br /&gt;
Als Kompromiss wird oft ein zufälliges Element als Pivot-Element genommen. Noch besser kann es sein, von drei zufällig gewählten Elementen jeweils das mittlere zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Java Implementierung ==&lt;br /&gt;
Bisher wurde die allgemeine Funktionsweise des Quicksorts beschrieben. Am Besten lassen sich komplexe [[Algorithmus|Algorithmen]] nachvollziehen, wenn Sie anhand einer Implementierung mit Hilfe eines [[Debugger|Debuggers]] analysiert werden.  Mit Hilfe des Quicksorts können beliebige Datenstrukturen sortiert werden. In der folgenden [[Java]] Implementierung wird ein [[Array]] bestehend aus Integern (kurz int) sortiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void quickSort(int array[], int links, int rechts) {&lt;br /&gt;
      if (links &amp;lt; rechts) {&lt;br /&gt;
         int i = teile(array,links,rechts);&lt;br /&gt;
         quickSort(array,links,i-1);&lt;br /&gt;
         quickSort(array,i+1,rechts);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public  int teile(int array[], int links, int rechts) {&lt;br /&gt;
      int pivot, i, j, help;&lt;br /&gt;
      pivot = array[rechts];               &lt;br /&gt;
      i     = links;&lt;br /&gt;
      j     = rechts-1;&lt;br /&gt;
      while(i&amp;lt;=j) {&lt;br /&gt;
         if (array[i] &amp;gt; pivot) {     &lt;br /&gt;
            // tausche x[i] und x[j]&lt;br /&gt;
            help = array[i]; &lt;br /&gt;
            array[i] = array[j]; &lt;br /&gt;
            array[j] = help;                             &lt;br /&gt;
&lt;br /&gt;
            j--;&lt;br /&gt;
         } else i++;            &lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // tausche x[i] und x[rechts]&lt;br /&gt;
      help      = array[i];&lt;br /&gt;
      array[i]      = array[rechts];&lt;br /&gt;
      array[rechts] = help;&lt;br /&gt;
      return i;&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Laufzeitanalyse ==&lt;br /&gt;
=== Worst-Case ===&lt;br /&gt;
[[Datei:Baum N-Ebenen.png|mini]]&lt;br /&gt;
Betrachten wir zunächst die Worst-Case-[[Laufzeitanalyse]]. Angenommen, wir haben wirklich Pech und die Partitionsgrößen sind wirklich unausgeglichen. Angenommen, der von der Partitionsfunktion ausgewählte Drehpunkt ist immer entweder das kleinste oder das größte Element im Subarray für n-Elemente. Dann enthält eine der Partitionen keine Elemente und die andere Partition enthält n-1 Elemente - alle außer dem Pivot. Die rekursiven Aufrufe erfolgen also auf Subarrays der Größen 0 und n-1.&lt;br /&gt;
&lt;br /&gt;
In diesem Szenario benötigt [[Rekursion|rekursive]] Aufruf von n-1  Elementen c* (n - 1) für eine Konstante c. Dies Konstante c repräsentiert die Benötigte Zeit für eine Operation wie einen Aufruf oder einen Vergleich. Für n-2 Elemente werden die Zeit c*(n-2) benötigt und so weiter (siehe Abbildung).&lt;br /&gt;
&lt;br /&gt;
Wenn wir die Partitionierungszeiten für jede Ebene aufsummieren, erhalten wir nach der [[Arithmetische-reihe|gauschen Summenformel]]:&lt;br /&gt;
&amp;lt;math&amp;gt;cn+c(n−1)+c(n−2)+⋯+2c = c(n+(n−1)+(n−2)+⋯+2) =c((n+1)(n/2)−1)&amp;lt;/math&amp;gt; &lt;br /&gt;
Im Rahmend er [[Laufzeitanalyse]] ignorieren wir Terme niedriger Ordnung und konstante Koeffizienten. In der Big-Θ-Notation folgt hieraus die Worst-Case-Laufzeit von QuickSort &amp;lt;math&amp;gt; O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Best Case ==&lt;br /&gt;
[[Datei:Verzweigungsbaum Quicksort symetrisch.png|mini]]&lt;br /&gt;
Der beste Fall von Quicksort liegt vor, wenn die Partitionen so gleichmäßig wie möglich aufgeteilt werden: Ihre Größen sind entweder gleich oder weichen nur um ein Element  voneinander ab. &lt;br /&gt;
&lt;br /&gt;
[[Datei:SubArrays symetrisch Quicksort.png|mini]]&lt;br /&gt;
Der erstere Fall tritt auf, wenn das Subarray eine ungerade Anzahl von Elementen hat und der Drehpunkt nach der Partitionierung genau in der Mitte liegt und jede Partition &amp;lt;math&amp;gt;(n-1) / 2 &amp;lt;/math&amp;gt; hat.  Der letztere Fall tritt auf, wenn das Subarray eine gerade Anzahl n von Elementen hat und eine Partition n / 2 hat, während die andere n-1 / 2 hat. In beiden Fällen hat jede Partition höchstens n / 2 Elemente.&lt;br /&gt;
&lt;br /&gt;
Wird die Anzahl  der zu sortierenden Elemente n verdoppelt, muss nur eine neue Ebene mit Teilarrays erzeugt werden. Dieses Wachstum lässt sich mit &amp;lt;math&amp;gt;log(n) &amp;lt;/math&amp;gt; beschreiben.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Zu sortierende Elemente n&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 16&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 32&lt;br /&gt;
|-&lt;br /&gt;
! Zu sortierende Elemente n&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^3}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^4}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^5}&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl Ebene log(n)&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 2&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 3&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In jeder Ebene müssen n Elemente sortiert werden. Hieraus ergibt sich eine Laufzeit von &amp;lt;math&amp;gt; O(n * log(n))&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2722</id>
		<title>Quicksort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2722"/>
		<updated>2026-02-20T09:46:23Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Laufzeitanalyse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Rekursive Baumstruktur.jpg|mini]]&lt;br /&gt;
Ein oft eingesetzter [[Sortieren|Sortier]]-Algorithmus ist der Quicksort. Der Quicksort funktioniert nach dem Prinzip »teile und herrsche«, was mit Hilfe der [[Rekursion]] realisiert wird. Die zu sortierenden [[Daten]] werden immer in zwei Teile zerlegt (&amp;quot;Teile&amp;quot;) und wieder sortiert (&amp;quot;Herrsche&amp;quot;)). Diese zwei Teile werden wiederum jeweils in zwei Teile zerlegt und sortiert usw., bis die Daten sortiert sind. Die [[Rekursion]] beendet sich, wenn das Teilstück aus nur noch einem Element besteht (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm#mj035bded10a26be556df779f234784e89).&lt;br /&gt;
&lt;br /&gt;
Die Zerlegung in zwei Teile erfolgt anhand eines sogenannten Pivot-Elementes. Ein Element der Liste wird als Pivot Element ausgewählt und dann werden alle weiteren Elemente der zu sortierenden Liste mit diesem Element verglichen. Die zu sortierende Liste wird in zwei Bereiche unterteilt. Alle Elemente die kleiner sind als das Pivot-Element werden links von dem Pivot-Element einsortiert. Alle Elemente die größer sind, werden rechts von Pivot-Element abgelegt.&lt;br /&gt;
&lt;br /&gt;
Die Elemente, die gleich dem Pivotelement sind, können sich beliebig auf die Teillisten verteilen. Nach der Aufteilung sind die Elemente der linken Liste kleiner oder gleich dem Pivot-Element und somit auch kleiner oder gleich den Elementen der rechten Liste. Die Elemente der linken und rechten Liste sind je Liste noch unsortiert.&lt;br /&gt;
&lt;br /&gt;
Anschließend muss man noch jede Teilliste in sich sortieren, um die Sortierung zu vollenden. Dazu wird der Quicksort-Algorithmus jeweils auf der linken und auf der rechten Teilliste ausgeführt. Jede Teilliste wird dann wieder in zwei Teillisten aufgeteilt und auf diese jeweils wieder der Quicksort-Algorithmus angewandt, und so fort.&lt;br /&gt;
&lt;br /&gt;
Die Teillisten sind immer Abschnitte auf der ursprünglichen Liste, so dass kein zusätzlicher Speicher benötigt wird. &lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Als Beispiel betrachten wir eine Liste mit Zahlen. Wir wählen immer das erste Element als Pivot-Element. Zu Beginn ist die Zahl 7  zufällig das Pivot-Element.&lt;br /&gt;
&lt;br /&gt;
7 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;10 8&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;11&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;3 1 5 2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zahlen, die kleiner als das Pivot-Element 7 sind, wurden blau markiert. Die Zahlen größer 7 haben sind rot markiert. Als ersten Schritt ändert QuickSort die Liste folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; 1 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun sind alle Zahlen, welche kleiner sind als 7, links von ihr. Alle Zahlen welche größer sind als die 7, stehen rechts. Die Reihenfolge der Zahlen in den Teillisten ist hier willkürlich und hängt ab von der jeweiligen Implementierung. Entscheidend ist, dass alle Zahlen die kleiner sind als 7 links stehen und alle Zahlen die größer sind als 7 rechts.&lt;br /&gt;
&lt;br /&gt;
Als nächstes wird der Teil links von der 7 wieder per QuickSort sortiert. Als Pivot wird die Zahl 3 gewählt.  Die Zahlen die kleiner sind als 3 werden wieder blau markiert. Alle Zahlen größer 3 sind rot. Die Zahl 7 und die größeren Zahlen betrachten wir im Moment nicht, deshalb sind sie gelb hinterlegt:&lt;br /&gt;
&lt;br /&gt;
 3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus bringt die blauen und die roten Zahlen wieder in die richtige Ordnung. Man erhält dann das Folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1 2&amp;lt;/span&amp;gt; 3 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;6 5 4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Das wird fortgesetzt bis der linke Teil des Arrays sortiert ist. Das sieht dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;&#039;&#039;1  2  3  4  5  6&#039;&#039;&#039;&#039;&#039;  7  9 11  8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun wird rechts von der 7 sortiert. Wieder wird ein Pivot gewählt, hier die 9, und die kleineren und größeren Zahlen auf die jeweils richtige Seite gebracht.&lt;br /&gt;
&lt;br /&gt;
Der grundsätzlichen Algorithmus lässt mit PseudoCode wie folgt beschreiben:&lt;br /&gt;
&lt;br /&gt;
== Pseudocode ==&lt;br /&gt;
Der folgende Pseudocode illustriert die Arbeitsweise des [[Algorithmus]]. Bei jedem Aufruf von quicksort(...) gibt links den Index des ersten Elements in der Teilliste an und rechts den des letzten. Beim ersten Aufruf (oberste Rekursionsebene) ist links = 0 und rechts = n-1. Die übergebene Liste wird dabei [[Rekursion|rekursiv]] immer weiter geteilt, bis sie nur noch einen Wert enthält.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
funktion quicksort(links, rechts) &lt;br /&gt;
    falls links &amp;lt; rechts dann &lt;br /&gt;
        teiler := teile(links, rechts) &lt;br /&gt;
        quicksort(links, teiler - 1) &lt;br /&gt;
        quicksort(teiler + 1, rechts) &lt;br /&gt;
    ende&lt;br /&gt;
ende&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wahl des Pivot-Elements ==&lt;br /&gt;
Die Wahl des Pivotelements ist wichtig. Die schlechteste Wahl des Pivots ist das Element, welches ganz am linken oder ganz am rechten Rand des zu sortierenden Intervalls endet. Mit linkem oder rechten Element ist nicht das Element gemeint, welches sich in der unsortierten Liste ganz Links (im Beispiel die 7) oder rechts befindet, sondern das kleinste (im Beispiel die 1) bzw. das größte Element (im Beispiel die 12). Der QuickSort ist dann am Effizientesten, wenn man ein Pivot-Element wählt, welches am Schluss genau in der Mitte zu liegen kommt (im Beispiel die 6 oder die 7). Leider ist dieses Element nicht ganz einfach zu finden.&lt;br /&gt;
&lt;br /&gt;
Man sollte deshalb nicht immer wie im Beispiel das erste Element als Pivot wählen. Dies ist zwar leicht zu implementieren, allerdings führt dies zu einem langsamen &amp;quot;QuickSort&amp;quot;, falls  das Array bereits sortiert ist, oder nahezu sortiert ist.&lt;br /&gt;
&lt;br /&gt;
Als Kompromiss wird oft ein zufälliges Element als Pivot-Element genommen. Noch besser kann es sein, von drei zufällig gewählten Elementen jeweils das mittlere zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Java Implementierung ==&lt;br /&gt;
Bisher wurde die allgemeine Funktionsweise des Quicksorts beschrieben. Am Besten lassen sich komplexe [[Algorithmus|Algorithmen]] nachvollziehen, wenn Sie anhand einer Implementierung mit Hilfe eines [[Debugger|Debuggers]] analysiert werden.  Mit Hilfe des Quicksorts können beliebige Datenstrukturen sortiert werden. In der folgenden [[Java]] Implementierung wird ein [[Array]] bestehend aus Integern (kurz int) sortiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void quickSort(int array[], int links, int rechts) {&lt;br /&gt;
      if (links &amp;lt; rechts) {&lt;br /&gt;
         int i = teile(array,links,rechts);&lt;br /&gt;
         quickSort(array,links,i-1);&lt;br /&gt;
         quickSort(array,i+1,rechts);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public  int teile(int array[], int links, int rechts) {&lt;br /&gt;
      int pivot, i, j, help;&lt;br /&gt;
      pivot = array[rechts];               &lt;br /&gt;
      i     = links;&lt;br /&gt;
      j     = rechts-1;&lt;br /&gt;
      while(i&amp;lt;=j) {&lt;br /&gt;
         if (array[i] &amp;gt; pivot) {     &lt;br /&gt;
            // tausche x[i] und x[j]&lt;br /&gt;
            help = array[i]; &lt;br /&gt;
            array[i] = array[j]; &lt;br /&gt;
            array[j] = help;                             &lt;br /&gt;
&lt;br /&gt;
            j--;&lt;br /&gt;
         } else i++;            &lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // tausche x[i] und x[rechts]&lt;br /&gt;
      help      = array[i];&lt;br /&gt;
      array[i]      = array[rechts];&lt;br /&gt;
      array[rechts] = help;&lt;br /&gt;
      return i;&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Laufzeitanalyse ==&lt;br /&gt;
=== Worst-Case ===&lt;br /&gt;
[[Datei:Baum N-Ebenen.png|mini]]&lt;br /&gt;
Betrachten wir zunächst die Worst-Case-[[Laufzeitanalyse]]. Angenommen, wir haben wirklich Pech und die Partitionsgrößen sind wirklich unausgeglichen. Angenommen, der von der Partitionsfunktion ausgewählte Drehpunkt ist immer entweder das kleinste oder das größte Element im Subarray für n-Elemente. Dann enthält eine der Partitionen keine Elemente und die andere Partition enthält n-1 Elemente - alle außer dem Pivot. Die rekursiven Aufrufe erfolgen also auf Subarrays der Größen 0 und n-1.&lt;br /&gt;
&lt;br /&gt;
In diesem Szenario benötigt [[Rekursion|rekursive]] Aufruf von n-1  Elementen c* (n - 1) für eine Konstante c. Dies Konstante c repräsentiert die Benötigte Zeit für eine Operation wie einen Aufruf oder einen Vergleich. Für n-2 Elemente werden die Zeit c*(n-2) benötigt und so weiter (siehe Abbildung).&lt;br /&gt;
&lt;br /&gt;
Wenn wir die Partitionierungszeiten für jede Ebene aufsummieren, erhalten wir nach der [[Arithmetische-reihe|gauschen Summenformel]]:&lt;br /&gt;
&amp;lt;math&amp;gt;cn+c(n−1)+c(n−2)+⋯+2c = c(n+(n−1)+(n−2)+⋯+2) =c((n+1)(n/2)−1)&amp;lt;/math&amp;gt; &lt;br /&gt;
Im Rahmend er Laufzeitanalyse ignorieren wir Terme niedriger Ordnung und konstante Koeffizienten. In der Big-Θ-Notation folgt hieraus die Worst-Case-Laufzeit von QuickSort &amp;lt;math&amp;gt; O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Best Case ==&lt;br /&gt;
[[Datei:Verzweigungsbaum Quicksort symetrisch.png|mini]]&lt;br /&gt;
Der beste Fall von Quicksort liegt vor, wenn die Partitionen so gleichmäßig wie möglich aufgeteilt werden: Ihre Größen sind entweder gleich oder weichen nur um ein Element  voneinander ab. &lt;br /&gt;
&lt;br /&gt;
[[Datei:SubArrays symetrisch Quicksort.png|mini]]&lt;br /&gt;
Der erstere Fall tritt auf, wenn das Subarray eine ungerade Anzahl von Elementen hat und der Drehpunkt nach der Partitionierung genau in der Mitte liegt und jede Partition &amp;lt;math&amp;gt;(n-1) / 2 &amp;lt;/math&amp;gt; hat.  Der letztere Fall tritt auf, wenn das Subarray eine gerade Anzahl n von Elementen hat und eine Partition n / 2 hat, während die andere n-1 / 2 hat. In beiden Fällen hat jede Partition höchstens n / 2 Elemente.&lt;br /&gt;
&lt;br /&gt;
Wird die Anzahl  der zu sortierenden Elemente n verdoppelt, muss nur eine neue Ebene mit Teilarrays erzeugt werden. Dieses Wachstum lässt sich mit &amp;lt;math&amp;gt;log(n) &amp;lt;/math&amp;gt; beschreiben.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Zu sortierende Elemente n&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 16&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 32&lt;br /&gt;
|-&lt;br /&gt;
! Zu sortierende Elemente n&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^3}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^4}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^5}&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl Ebene log(n)&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 2&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 3&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In jeder Ebene müssen n Elemente sortiert werden. Hieraus ergibt sich eine Laufzeit von &amp;lt;math&amp;gt; O(n * log(n))&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2721</id>
		<title>Quicksort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2721"/>
		<updated>2026-02-20T09:45:18Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Rekursive Baumstruktur.jpg|mini]]&lt;br /&gt;
Ein oft eingesetzter [[Sortieren|Sortier]]-Algorithmus ist der Quicksort. Der Quicksort funktioniert nach dem Prinzip »teile und herrsche«, was mit Hilfe der [[Rekursion]] realisiert wird. Die zu sortierenden [[Daten]] werden immer in zwei Teile zerlegt (&amp;quot;Teile&amp;quot;) und wieder sortiert (&amp;quot;Herrsche&amp;quot;)). Diese zwei Teile werden wiederum jeweils in zwei Teile zerlegt und sortiert usw., bis die Daten sortiert sind. Die [[Rekursion]] beendet sich, wenn das Teilstück aus nur noch einem Element besteht (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm#mj035bded10a26be556df779f234784e89).&lt;br /&gt;
&lt;br /&gt;
Die Zerlegung in zwei Teile erfolgt anhand eines sogenannten Pivot-Elementes. Ein Element der Liste wird als Pivot Element ausgewählt und dann werden alle weiteren Elemente der zu sortierenden Liste mit diesem Element verglichen. Die zu sortierende Liste wird in zwei Bereiche unterteilt. Alle Elemente die kleiner sind als das Pivot-Element werden links von dem Pivot-Element einsortiert. Alle Elemente die größer sind, werden rechts von Pivot-Element abgelegt.&lt;br /&gt;
&lt;br /&gt;
Die Elemente, die gleich dem Pivotelement sind, können sich beliebig auf die Teillisten verteilen. Nach der Aufteilung sind die Elemente der linken Liste kleiner oder gleich dem Pivot-Element und somit auch kleiner oder gleich den Elementen der rechten Liste. Die Elemente der linken und rechten Liste sind je Liste noch unsortiert.&lt;br /&gt;
&lt;br /&gt;
Anschließend muss man noch jede Teilliste in sich sortieren, um die Sortierung zu vollenden. Dazu wird der Quicksort-Algorithmus jeweils auf der linken und auf der rechten Teilliste ausgeführt. Jede Teilliste wird dann wieder in zwei Teillisten aufgeteilt und auf diese jeweils wieder der Quicksort-Algorithmus angewandt, und so fort.&lt;br /&gt;
&lt;br /&gt;
Die Teillisten sind immer Abschnitte auf der ursprünglichen Liste, so dass kein zusätzlicher Speicher benötigt wird. &lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Als Beispiel betrachten wir eine Liste mit Zahlen. Wir wählen immer das erste Element als Pivot-Element. Zu Beginn ist die Zahl 7  zufällig das Pivot-Element.&lt;br /&gt;
&lt;br /&gt;
7 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;10 8&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;11&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;3 1 5 2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zahlen, die kleiner als das Pivot-Element 7 sind, wurden blau markiert. Die Zahlen größer 7 haben sind rot markiert. Als ersten Schritt ändert QuickSort die Liste folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; 1 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun sind alle Zahlen, welche kleiner sind als 7, links von ihr. Alle Zahlen welche größer sind als die 7, stehen rechts. Die Reihenfolge der Zahlen in den Teillisten ist hier willkürlich und hängt ab von der jeweiligen Implementierung. Entscheidend ist, dass alle Zahlen die kleiner sind als 7 links stehen und alle Zahlen die größer sind als 7 rechts.&lt;br /&gt;
&lt;br /&gt;
Als nächstes wird der Teil links von der 7 wieder per QuickSort sortiert. Als Pivot wird die Zahl 3 gewählt.  Die Zahlen die kleiner sind als 3 werden wieder blau markiert. Alle Zahlen größer 3 sind rot. Die Zahl 7 und die größeren Zahlen betrachten wir im Moment nicht, deshalb sind sie gelb hinterlegt:&lt;br /&gt;
&lt;br /&gt;
 3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus bringt die blauen und die roten Zahlen wieder in die richtige Ordnung. Man erhält dann das Folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1 2&amp;lt;/span&amp;gt; 3 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;6 5 4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Das wird fortgesetzt bis der linke Teil des Arrays sortiert ist. Das sieht dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;&#039;&#039;1  2  3  4  5  6&#039;&#039;&#039;&#039;&#039;  7  9 11  8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun wird rechts von der 7 sortiert. Wieder wird ein Pivot gewählt, hier die 9, und die kleineren und größeren Zahlen auf die jeweils richtige Seite gebracht.&lt;br /&gt;
&lt;br /&gt;
Der grundsätzlichen Algorithmus lässt mit PseudoCode wie folgt beschreiben:&lt;br /&gt;
&lt;br /&gt;
== Pseudocode ==&lt;br /&gt;
Der folgende Pseudocode illustriert die Arbeitsweise des [[Algorithmus]]. Bei jedem Aufruf von quicksort(...) gibt links den Index des ersten Elements in der Teilliste an und rechts den des letzten. Beim ersten Aufruf (oberste Rekursionsebene) ist links = 0 und rechts = n-1. Die übergebene Liste wird dabei [[Rekursion|rekursiv]] immer weiter geteilt, bis sie nur noch einen Wert enthält.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
funktion quicksort(links, rechts) &lt;br /&gt;
    falls links &amp;lt; rechts dann &lt;br /&gt;
        teiler := teile(links, rechts) &lt;br /&gt;
        quicksort(links, teiler - 1) &lt;br /&gt;
        quicksort(teiler + 1, rechts) &lt;br /&gt;
    ende&lt;br /&gt;
ende&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wahl des Pivot-Elements ==&lt;br /&gt;
Die Wahl des Pivotelements ist wichtig. Die schlechteste Wahl des Pivots ist das Element, welches ganz am linken oder ganz am rechten Rand des zu sortierenden Intervalls endet. Mit linkem oder rechten Element ist nicht das Element gemeint, welches sich in der unsortierten Liste ganz Links (im Beispiel die 7) oder rechts befindet, sondern das kleinste (im Beispiel die 1) bzw. das größte Element (im Beispiel die 12). Der QuickSort ist dann am Effizientesten, wenn man ein Pivot-Element wählt, welches am Schluss genau in der Mitte zu liegen kommt (im Beispiel die 6 oder die 7). Leider ist dieses Element nicht ganz einfach zu finden.&lt;br /&gt;
&lt;br /&gt;
Man sollte deshalb nicht immer wie im Beispiel das erste Element als Pivot wählen. Dies ist zwar leicht zu implementieren, allerdings führt dies zu einem langsamen &amp;quot;QuickSort&amp;quot;, falls  das Array bereits sortiert ist, oder nahezu sortiert ist.&lt;br /&gt;
&lt;br /&gt;
Als Kompromiss wird oft ein zufälliges Element als Pivot-Element genommen. Noch besser kann es sein, von drei zufällig gewählten Elementen jeweils das mittlere zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Java Implementierung ==&lt;br /&gt;
Bisher wurde die allgemeine Funktionsweise des Quicksorts beschrieben. Am Besten lassen sich komplexe [[Algorithmus|Algorithmen]] nachvollziehen, wenn Sie anhand einer Implementierung mit Hilfe eines [[Debugger|Debuggers]] analysiert werden.  Mit Hilfe des Quicksorts können beliebige Datenstrukturen sortiert werden. In der folgenden [[Java]] Implementierung wird ein [[Array]] bestehend aus Integern (kurz int) sortiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void quickSort(int array[], int links, int rechts) {&lt;br /&gt;
      if (links &amp;lt; rechts) {&lt;br /&gt;
         int i = teile(array,links,rechts);&lt;br /&gt;
         quickSort(array,links,i-1);&lt;br /&gt;
         quickSort(array,i+1,rechts);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public  int teile(int array[], int links, int rechts) {&lt;br /&gt;
      int pivot, i, j, help;&lt;br /&gt;
      pivot = array[rechts];               &lt;br /&gt;
      i     = links;&lt;br /&gt;
      j     = rechts-1;&lt;br /&gt;
      while(i&amp;lt;=j) {&lt;br /&gt;
         if (array[i] &amp;gt; pivot) {     &lt;br /&gt;
            // tausche x[i] und x[j]&lt;br /&gt;
            help = array[i]; &lt;br /&gt;
            array[i] = array[j]; &lt;br /&gt;
            array[j] = help;                             &lt;br /&gt;
&lt;br /&gt;
            j--;&lt;br /&gt;
         } else i++;            &lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // tausche x[i] und x[rechts]&lt;br /&gt;
      help      = array[i];&lt;br /&gt;
      array[i]      = array[rechts];&lt;br /&gt;
      array[rechts] = help;&lt;br /&gt;
      return i;&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Laufzeitanalyse ==&lt;br /&gt;
=== Worst-Case ===&lt;br /&gt;
[[Datei:Baum N-Ebenen.png|mini]]&lt;br /&gt;
Betrachten wir zunächst die Worst-Case-Laufzeitanalyseaufzeit. Angenommen, wir haben wirklich Pech und die Partitionsgrößen sind wirklich unausgeglichen. Angenommen, der von der Partitionsfunktion ausgewählte Drehpunkt ist immer entweder das kleinste oder das größte Element im Subarray für n-Elemente. Dann enthält eine der Partitionen keine Elemente und die andere Partition enthält n-1 Elemente - alle außer dem Pivot. Die rekursiven Aufrufe erfolgen also auf Subarrays der Größen 0 und n-1.&lt;br /&gt;
&lt;br /&gt;
In diesem Szenario benötigt [[Rekursion|rekursive]] Aufruf von n-1  Elementen c* (n - 1) für eine Konstante c. Dies Konstante c repräsentiert die Benötigte Zeit für eine Operation wie einen Aufruf oder einen Vergleich. Für n-2 Elemente werden die Zeit c*(n-2) benötigt und so weiter (siehe Abbildung).&lt;br /&gt;
&lt;br /&gt;
Wenn wir die Partitionierungszeiten für jede Ebene aufsummieren, erhalten wir nach der [[Arithmetische-reihe|gauschen Summenformel]]:&lt;br /&gt;
&amp;lt;math&amp;gt;cn+c(n−1)+c(n−2)+⋯+2c = c(n+(n−1)+(n−2)+⋯+2) =c((n+1)(n/2)−1)&amp;lt;/math&amp;gt; &lt;br /&gt;
Im Rahmend er Laufzeitanalyse ignorieren wir Terme niedriger Ordnung und konstante Koeffizienten. In der Big-Θ-Notation folgt hieraus die Worst-Case-Laufzeit von QuickSort &amp;lt;math&amp;gt; O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Best Case ==&lt;br /&gt;
[[Datei:Verzweigungsbaum Quicksort symetrisch.png|mini]]&lt;br /&gt;
Der beste Fall von Quicksort liegt vor, wenn die Partitionen so gleichmäßig wie möglich aufgeteilt werden: Ihre Größen sind entweder gleich oder weichen nur um ein Element  voneinander ab. &lt;br /&gt;
&lt;br /&gt;
[[Datei:SubArrays symetrisch Quicksort.png|mini]]&lt;br /&gt;
Der erstere Fall tritt auf, wenn das Subarray eine ungerade Anzahl von Elementen hat und der Drehpunkt nach der Partitionierung genau in der Mitte liegt und jede Partition &amp;lt;math&amp;gt;(n-1) / 2 &amp;lt;/math&amp;gt; hat.  Der letztere Fall tritt auf, wenn das Subarray eine gerade Anzahl n von Elementen hat und eine Partition n / 2 hat, während die andere n-1 / 2 hat. In beiden Fällen hat jede Partition höchstens n / 2 Elemente.&lt;br /&gt;
&lt;br /&gt;
Wird die Anzahl  der zu sortierenden Elemente n verdoppelt, muss nur eine neue Ebene mit Teilarrays erzeugt werden. Dieses Wachstum lässt sich mit &amp;lt;math&amp;gt;log(n) &amp;lt;/math&amp;gt; beschreiben.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Zu sortierende Elemente n&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 8&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 16&lt;br /&gt;
| style=&amp;quot;color:green&amp;quot; | 32&lt;br /&gt;
|-&lt;br /&gt;
! Zu sortierende Elemente n&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^3}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^4}&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\color{green}{2^5}&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Anzahl Ebene log(n)&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 2&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 3&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;color:red&amp;quot; | 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In jeder Ebene müssen n Elemente sortiert werden. Hieraus ergibt sich eine Laufzeit von &amp;lt;math&amp;gt; O(n * log(n))&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Datei:SubArrays_symetrisch_Quicksort.png&amp;diff=2720</id>
		<title>Datei:SubArrays symetrisch Quicksort.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Datei:SubArrays_symetrisch_Quicksort.png&amp;diff=2720"/>
		<updated>2026-02-20T09:42:17Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SubArrays symetrisch Quicksort&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Datei:Verzweigungsbaum_Quicksort_symetrisch.png&amp;diff=2719</id>
		<title>Datei:Verzweigungsbaum Quicksort symetrisch.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Datei:Verzweigungsbaum_Quicksort_symetrisch.png&amp;diff=2719"/>
		<updated>2026-02-20T09:41:08Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Verzweigungsbaum Quicksort symetrisch&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2718</id>
		<title>Laufzeitanalyse</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2718"/>
		<updated>2026-02-20T08:21:35Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Die Laufzeitanalyse betrachtet die Zeitkomplexität eines [[Algorithmus]]. Da die Zeit zur Ausführung eines Algorithmuses von der Hardwareausstattung des Zielsystems abhängt, wird für eine allgemeine Betrachtung die Anzahl der [[Anweisung|Befehle]] analysiert, die ein Algorithmus zur Lösung eines gegebenen Problems benötigt. Die Lösung eines Problems mit Hilfe eines gegebenen Algorithmus ist abhängig von der Eingabe.  Die Eingabe wird auch als Problemgröße bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Die Analyse für kleine Eingabemengen ist häufig nicht so bedeutsam, weil für diesen Fall auch schwach konzipierte [[Algorithmus|Algorithmen]] befriedigende Ergebnisse liefern. Wichtiger sind die Betrachtungen für sehr große Problemgrößen und einer ungünstigen Anordnung der Werte (worst-case). Dabei wird von der asymptotischen [[Programmausführung|Laufzeit]] gesprochen und meint damit, in Anlehnung an eine Asymptote, das Zeitverhalten des Algorithmus für eine potenziell unendlich große Eingabemenge. Soll z.B. eine Folge von Zahlen [[Sortieren|sortiert]] werden, dann betrachtet man eine theoretisch unendliche lange Folge von Zahlen.&lt;br /&gt;
&lt;br /&gt;
Lässt sich ein Algorithmus mathematisch durch die Funktion beschreiben, so gilt: &amp;lt;math&amp;gt;f(x)=1/x+x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die rot dargestellte Funktion&amp;lt;math&amp;gt; \color{Red}{f(x) = 1/x + x} &amp;lt;/math&amp;gt;nähert sich für große x der grün dargestellte Asymptote &amp;lt;math&amp;gt; \color{green}{g(x)} &amp;lt;/math&amp;gt; an.&lt;br /&gt;
&lt;br /&gt;
Die Laufzeit wird in Abhängigkeit von der Länge n der Eingabe angegeben und für immer größer werdende n asymptotisch unter Verwendung der Landau-Notation(Groß-O-Notation) abgeschätzt. &lt;br /&gt;
&lt;br /&gt;
In der Praxis ist die Laufzeitanalyse interessant, weil hierdurch entschieden werden kann, ob ein Programm bei anwachsender Eingabemenge wirtschaftlich betrieben werden kann.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Programmausf%C3%BChrung&amp;diff=2717</id>
		<title>Programmausführung</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Programmausf%C3%BChrung&amp;diff=2717"/>
		<updated>2026-02-20T08:17:46Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:SoftwareentwicklungAlsModell.png|mini]]&lt;br /&gt;
Die Programmausführung wird auch als Programmablauf, Laufzeit, Ausführungszeit oder Runtime bezeichnet. Um ein Programm auszuführen, arbeiten verschiedene Hardware- und Software-Komponenten eines Computers zusammen. Es wird auf unterster Ebene der Maschinensprache der Software über das Betriebssystem (d. h. ebenfalls durch dessen Maschinbefehle) in den Hauptspeicher des Computers geladen und dem Rechenwerk Schritt für Schritt zur Ausführung zugeführt.&lt;br /&gt;
&lt;br /&gt;
Die Maschinensprache muss hierzu in einer Form/Struktur ([[Syntax]]) vorliegen, die von der Hardware ausgeführt werden kann. Inhalt und Struktur der Befehle zeigen an, was zu tun ist, welche Bereiche im Hauptspeicher dabei benutzt oder verändert werden sollen. Dieses Arbeitsprinzip gilt für jede Art von Software. Software wird in den meisten Fällen nicht in Maschinensprache erstellt. Mit Hilfe von Interpretern oder [[Compiler|Compilern]] wird die Software in Maschinensprache übersetzt, damit sie von einem Prozessor ausgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann eine Laufzeitumgebung zwischen geschaltet werden, die letztlich auch eine Software ist und Maschinensprache erzeugt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2716</id>
		<title>Laufzeitanalyse</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Laufzeitanalyse&amp;diff=2716"/>
		<updated>2026-02-20T08:13:52Z</updated>

		<summary type="html">&lt;p&gt;Thomas: Die Seite wurde neu angelegt: „== Einführung == Die Laufzeitanalyse betrachtet die Zeitkomplexität eines Algorithmus. Da die Zeit zur Ausführung eines Algorithmuses von der Hardwareausstattung des Zielsystems abhängt, wird für eine allgemeine Betrachtung die Anzahl der Befehle analysiert, die ein Algorithmus zur Lösung eines gegebenen Problems benötigt. Die Lösung eines Problems mit Hilfe eines gegebenen Algorithmus ist abhängig von der Eingabe.  Die Eingabe…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Die Laufzeitanalyse betrachtet die Zeitkomplexität eines [[Algorithmus]]. Da die Zeit zur Ausführung eines Algorithmuses von der Hardwareausstattung des Zielsystems abhängt, wird für eine allgemeine Betrachtung die Anzahl der [[Anweisung|Befehle]] analysiert, die ein Algorithmus zur Lösung eines gegebenen Problems benötigt. Die Lösung eines Problems mit Hilfe eines gegebenen Algorithmus ist abhängig von der Eingabe.  Die Eingabe wird auch als Problemgröße bezeichnet.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2715</id>
		<title>Quicksort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2715"/>
		<updated>2026-02-20T08:12:12Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Rekursive Baumstruktur.jpg|mini]]&lt;br /&gt;
Ein oft eingesetzter [[Sortieren|Sortier]]-Algorithmus ist der Quicksort. Der Quicksort funktioniert nach dem Prinzip »teile und herrsche«, was mit Hilfe der [[Rekursion]] realisiert wird. Die zu sortierenden [[Daten]] werden immer in zwei Teile zerlegt (&amp;quot;Teile&amp;quot;) und wieder sortiert (&amp;quot;Herrsche&amp;quot;)). Diese zwei Teile werden wiederum jeweils in zwei Teile zerlegt und sortiert usw., bis die Daten sortiert sind. Die [[Rekursion]] beendet sich, wenn das Teilstück aus nur noch einem Element besteht (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm#mj035bded10a26be556df779f234784e89).&lt;br /&gt;
&lt;br /&gt;
Die Zerlegung in zwei Teile erfolgt anhand eines sogenannten Pivot-Elementes. Ein Element der Liste wird als Pivot Element ausgewählt und dann werden alle weiteren Elemente der zu sortierenden Liste mit diesem Element verglichen. Die zu sortierende Liste wird in zwei Bereiche unterteilt. Alle Elemente die kleiner sind als das Pivot-Element werden links von dem Pivot-Element einsortiert. Alle Elemente die größer sind, werden rechts von Pivot-Element abgelegt.&lt;br /&gt;
&lt;br /&gt;
Die Elemente, die gleich dem Pivotelement sind, können sich beliebig auf die Teillisten verteilen. Nach der Aufteilung sind die Elemente der linken Liste kleiner oder gleich dem Pivot-Element und somit auch kleiner oder gleich den Elementen der rechten Liste. Die Elemente der linken und rechten Liste sind je Liste noch unsortiert.&lt;br /&gt;
&lt;br /&gt;
Anschließend muss man noch jede Teilliste in sich sortieren, um die Sortierung zu vollenden. Dazu wird der Quicksort-Algorithmus jeweils auf der linken und auf der rechten Teilliste ausgeführt. Jede Teilliste wird dann wieder in zwei Teillisten aufgeteilt und auf diese jeweils wieder der Quicksort-Algorithmus angewandt, und so fort.&lt;br /&gt;
&lt;br /&gt;
Die Teillisten sind immer Abschnitte auf der ursprünglichen Liste, so dass kein zusätzlicher Speicher benötigt wird. &lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Als Beispiel betrachten wir eine Liste mit Zahlen. Wir wählen immer das erste Element als Pivot-Element. Zu Beginn ist die Zahl 7  zufällig das Pivot-Element.&lt;br /&gt;
&lt;br /&gt;
7 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;10 8&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;11&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;3 1 5 2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zahlen, die kleiner als das Pivot-Element 7 sind, wurden blau markiert. Die Zahlen größer 7 haben sind rot markiert. Als ersten Schritt ändert QuickSort die Liste folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; 1 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun sind alle Zahlen, welche kleiner sind als 7, links von ihr. Alle Zahlen welche größer sind als die 7, stehen rechts. Die Reihenfolge der Zahlen in den Teillisten ist hier willkürlich und hängt ab von der jeweiligen Implementierung. Entscheidend ist, dass alle Zahlen die kleiner sind als 7 links stehen und alle Zahlen die größer sind als 7 rechts.&lt;br /&gt;
&lt;br /&gt;
Als nächstes wird der Teil links von der 7 wieder per QuickSort sortiert. Als Pivot wird die Zahl 3 gewählt.  Die Zahlen die kleiner sind als 3 werden wieder blau markiert. Alle Zahlen größer 3 sind rot. Die Zahl 7 und die größeren Zahlen betrachten wir im Moment nicht, deshalb sind sie gelb hinterlegt:&lt;br /&gt;
&lt;br /&gt;
 3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus bringt die blauen und die roten Zahlen wieder in die richtige Ordnung. Man erhält dann das Folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1 2&amp;lt;/span&amp;gt; 3 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;6 5 4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Das wird fortgesetzt bis der linke Teil des Arrays sortiert ist. Das sieht dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;&#039;&#039;1  2  3  4  5  6&#039;&#039;&#039;&#039;&#039;  7  9 11  8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun wird rechts von der 7 sortiert. Wieder wird ein Pivot gewählt, hier die 9, und die kleineren und größeren Zahlen auf die jeweils richtige Seite gebracht.&lt;br /&gt;
&lt;br /&gt;
Der grundsätzlichen Algorithmus lässt mit PseudoCode wie folgt beschreiben:&lt;br /&gt;
&lt;br /&gt;
== Pseudocode ==&lt;br /&gt;
Der folgende Pseudocode illustriert die Arbeitsweise des [[Algorithmus]]. Bei jedem Aufruf von quicksort(...) gibt links den Index des ersten Elements in der Teilliste an und rechts den des letzten. Beim ersten Aufruf (oberste Rekursionsebene) ist links = 0 und rechts = n-1. Die übergebene Liste wird dabei [[Rekursion|rekursiv]] immer weiter geteilt, bis sie nur noch einen Wert enthält.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
funktion quicksort(links, rechts) &lt;br /&gt;
    falls links &amp;lt; rechts dann &lt;br /&gt;
        teiler := teile(links, rechts) &lt;br /&gt;
        quicksort(links, teiler - 1) &lt;br /&gt;
        quicksort(teiler + 1, rechts) &lt;br /&gt;
    ende&lt;br /&gt;
ende&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wahl des Pivot-Elements ==&lt;br /&gt;
Die Wahl des Pivotelements ist wichtig. Die schlechteste Wahl des Pivots ist das Element, welches ganz am linken oder ganz am rechten Rand des zu sortierenden Intervalls endet. Mit linkem oder rechten Element ist nicht das Element gemeint, welches sich in der unsortierten Liste ganz Links (im Beispiel die 7) oder rechts befindet, sondern das kleinste (im Beispiel die 1) bzw. das größte Element (im Beispiel die 12). Der QuickSort ist dann am Effizientesten, wenn man ein Pivot-Element wählt, welches am Schluss genau in der Mitte zu liegen kommt (im Beispiel die 6 oder die 7). Leider ist dieses Element nicht ganz einfach zu finden.&lt;br /&gt;
&lt;br /&gt;
Man sollte deshalb nicht immer wie im Beispiel das erste Element als Pivot wählen. Dies ist zwar leicht zu implementieren, allerdings führt dies zu einem langsamen &amp;quot;QuickSort&amp;quot;, falls  das Array bereits sortiert ist, oder nahezu sortiert ist.&lt;br /&gt;
&lt;br /&gt;
Als Kompromiss wird oft ein zufälliges Element als Pivot-Element genommen. Noch besser kann es sein, von drei zufällig gewählten Elementen jeweils das mittlere zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Java Implementierung ==&lt;br /&gt;
Bisher wurde die allgemeine Funktionsweise des Quicksorts beschrieben. Am Besten lassen sich komplexe [[Algorithmus|Algorithmen]] nachvollziehen, wenn Sie anhand einer Implementierung mit Hilfe eines [[Debugger|Debuggers]] analysiert werden.  Mit Hilfe des Quicksorts können beliebige Datenstrukturen sortiert werden. In der folgenden [[Java]] Implementierung wird ein [[Array]] bestehend aus Integern (kurz int) sortiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void quickSort(int array[], int links, int rechts) {&lt;br /&gt;
      if (links &amp;lt; rechts) {&lt;br /&gt;
         int i = teile(array,links,rechts);&lt;br /&gt;
         quickSort(array,links,i-1);&lt;br /&gt;
         quickSort(array,i+1,rechts);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public  int teile(int array[], int links, int rechts) {&lt;br /&gt;
      int pivot, i, j, help;&lt;br /&gt;
      pivot = array[rechts];               &lt;br /&gt;
      i     = links;&lt;br /&gt;
      j     = rechts-1;&lt;br /&gt;
      while(i&amp;lt;=j) {&lt;br /&gt;
         if (array[i] &amp;gt; pivot) {     &lt;br /&gt;
            // tausche x[i] und x[j]&lt;br /&gt;
            help = array[i]; &lt;br /&gt;
            array[i] = array[j]; &lt;br /&gt;
            array[j] = help;                             &lt;br /&gt;
&lt;br /&gt;
            j--;&lt;br /&gt;
         } else i++;            &lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // tausche x[i] und x[rechts]&lt;br /&gt;
      help      = array[i];&lt;br /&gt;
      array[i]      = array[rechts];&lt;br /&gt;
      array[rechts] = help;&lt;br /&gt;
      return i;&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Laufzeitanalyse ==&lt;br /&gt;
=== Worst-Case ===&lt;br /&gt;
[[Datei:Baum N-Ebenen.png|mini]]&lt;br /&gt;
Betrachten wir zunächst die Worst-Case-Laufzeitanalyseaufzeit. Angenommen, wir haben wirklich Pech und die Partitionsgrößen sind wirklich unausgeglichen. Angenommen, der von der Partitionsfunktion ausgewählte Drehpunkt ist immer entweder das kleinste oder das größte Element im Subarray für n-Elemente. Dann enthält eine der Partitionen keine Elemente und die andere Partition enthält n-1 Elemente - alle außer dem Pivot. Die rekursiven Aufrufe erfolgen also auf Subarrays der Größen 0 und n-1.&lt;br /&gt;
&lt;br /&gt;
In diesem Szenario benötigt [[Rekursion|rekursive]] Aufruf von n-1  Elementen c* (n - 1) für eine Konstante c. Dies Konstante c repräsentiert die Benötigte Zeit für eine Operation wie einen Aufruf oder einen Vergleich. Für n-2 Elemente werden die Zeit c*(n-2) benötigt und so weiter (siehe Abbildung).&lt;br /&gt;
&lt;br /&gt;
Wenn wir die Partitionierungszeiten für jede Ebene aufsummieren, erhalten wir nach der [[Arithmetische-reihe|gauschen Summenformel]]:&lt;br /&gt;
&amp;lt;math&amp;gt;cn+c(n−1)+c(n−2)+⋯+2c = c(n+(n−1)+(n−2)+⋯+2) =c((n+1)(n/2)−1)&amp;lt;/math&amp;gt; &lt;br /&gt;
Im Rahmend er Laufzeitanalyse ignorieren wir Terme niedriger Ordnung und konstante Koeffizienten. In der Big-Θ-Notation folgt hieraus die Worst-Case-Laufzeit von QuickSort &amp;lt;math&amp;gt; O(n^2)&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Datei:Baum_N-Ebenen.png&amp;diff=2714</id>
		<title>Datei:Baum N-Ebenen.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Datei:Baum_N-Ebenen.png&amp;diff=2714"/>
		<updated>2026-02-20T08:10:21Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Baum N-Ebenen&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2713</id>
		<title>Quicksort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2713"/>
		<updated>2026-02-20T08:07:20Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
[[Datei:Rekursive Baumstruktur.jpg|mini]]&lt;br /&gt;
Ein oft eingesetzter [[Sortieren|Sortier]]-Algorithmus ist der Quicksort. Der Quicksort funktioniert nach dem Prinzip »teile und herrsche«, was mit Hilfe der [[Rekursion]] realisiert wird. Die zu sortierenden [[Daten]] werden immer in zwei Teile zerlegt (&amp;quot;Teile&amp;quot;) und wieder sortiert (&amp;quot;Herrsche&amp;quot;)). Diese zwei Teile werden wiederum jeweils in zwei Teile zerlegt und sortiert usw., bis die Daten sortiert sind. Die [[Rekursion]] beendet sich, wenn das Teilstück aus nur noch einem Element besteht (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm#mj035bded10a26be556df779f234784e89).&lt;br /&gt;
&lt;br /&gt;
Die Zerlegung in zwei Teile erfolgt anhand eines sogenannten Pivot-Elementes. Ein Element der Liste wird als Pivot Element ausgewählt und dann werden alle weiteren Elemente der zu sortierenden Liste mit diesem Element verglichen. Die zu sortierende Liste wird in zwei Bereiche unterteilt. Alle Elemente die kleiner sind als das Pivot-Element werden links von dem Pivot-Element einsortiert. Alle Elemente die größer sind, werden rechts von Pivot-Element abgelegt.&lt;br /&gt;
&lt;br /&gt;
Die Elemente, die gleich dem Pivotelement sind, können sich beliebig auf die Teillisten verteilen. Nach der Aufteilung sind die Elemente der linken Liste kleiner oder gleich dem Pivot-Element und somit auch kleiner oder gleich den Elementen der rechten Liste. Die Elemente der linken und rechten Liste sind je Liste noch unsortiert.&lt;br /&gt;
&lt;br /&gt;
Anschließend muss man noch jede Teilliste in sich sortieren, um die Sortierung zu vollenden. Dazu wird der Quicksort-Algorithmus jeweils auf der linken und auf der rechten Teilliste ausgeführt. Jede Teilliste wird dann wieder in zwei Teillisten aufgeteilt und auf diese jeweils wieder der Quicksort-Algorithmus angewandt, und so fort.&lt;br /&gt;
&lt;br /&gt;
Die Teillisten sind immer Abschnitte auf der ursprünglichen Liste, so dass kein zusätzlicher Speicher benötigt wird. &lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Als Beispiel betrachten wir eine Liste mit Zahlen. Wir wählen immer das erste Element als Pivot-Element. Zu Beginn ist die Zahl 7  zufällig das Pivot-Element.&lt;br /&gt;
&lt;br /&gt;
7 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;10 8&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;11&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;3 1 5 2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zahlen, die kleiner als das Pivot-Element 7 sind, wurden blau markiert. Die Zahlen größer 7 haben sind rot markiert. Als ersten Schritt ändert QuickSort die Liste folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; 1 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun sind alle Zahlen, welche kleiner sind als 7, links von ihr. Alle Zahlen welche größer sind als die 7, stehen rechts. Die Reihenfolge der Zahlen in den Teillisten ist hier willkürlich und hängt ab von der jeweiligen Implementierung. Entscheidend ist, dass alle Zahlen die kleiner sind als 7 links stehen und alle Zahlen die größer sind als 7 rechts.&lt;br /&gt;
&lt;br /&gt;
Als nächstes wird der Teil links von der 7 wieder per QuickSort sortiert. Als Pivot wird die Zahl 3 gewählt.  Die Zahlen die kleiner sind als 3 werden wieder blau markiert. Alle Zahlen größer 3 sind rot. Die Zahl 7 und die größeren Zahlen betrachten wir im Moment nicht, deshalb sind sie gelb hinterlegt:&lt;br /&gt;
&lt;br /&gt;
 3 &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;5 6&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus bringt die blauen und die roten Zahlen wieder in die richtige Ordnung. Man erhält dann das Folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;1 2&amp;lt;/span&amp;gt; 3 &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;6 5 4&amp;lt;/span&amp;gt; 7 9 11 8 10 12&lt;br /&gt;
&lt;br /&gt;
Das wird fortgesetzt bis der linke Teil des Arrays sortiert ist. Das sieht dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;&#039;&#039;1  2  3  4  5  6&#039;&#039;&#039;&#039;&#039;  7  9 11  8 10 12&lt;br /&gt;
&lt;br /&gt;
Nun wird rechts von der 7 sortiert. Wieder wird ein Pivot gewählt, hier die 9, und die kleineren und größeren Zahlen auf die jeweils richtige Seite gebracht.&lt;br /&gt;
&lt;br /&gt;
Der grundsätzlichen Algorithmus lässt mit PseudoCode wie folgt beschreiben:&lt;br /&gt;
&lt;br /&gt;
== Pseudocode ==&lt;br /&gt;
Der folgende Pseudocode illustriert die Arbeitsweise des [[Algorithmus]]. Bei jedem Aufruf von quicksort(...) gibt links den Index des ersten Elements in der Teilliste an und rechts den des letzten. Beim ersten Aufruf (oberste Rekursionsebene) ist links = 0 und rechts = n-1. Die übergebene Liste wird dabei [[Rekursion|rekursiv]] immer weiter geteilt, bis sie nur noch einen Wert enthält.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
funktion quicksort(links, rechts) &lt;br /&gt;
    falls links &amp;lt; rechts dann &lt;br /&gt;
        teiler := teile(links, rechts) &lt;br /&gt;
        quicksort(links, teiler - 1) &lt;br /&gt;
        quicksort(teiler + 1, rechts) &lt;br /&gt;
    ende&lt;br /&gt;
ende&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wahl des Pivot-Elements ==&lt;br /&gt;
Die Wahl des Pivotelements ist wichtig. Die schlechteste Wahl des Pivots ist das Element, welches ganz am linken oder ganz am rechten Rand des zu sortierenden Intervalls endet. Mit linkem oder rechten Element ist nicht das Element gemeint, welches sich in der unsortierten Liste ganz Links (im Beispiel die 7) oder rechts befindet, sondern das kleinste (im Beispiel die 1) bzw. das größte Element (im Beispiel die 12). Der QuickSort ist dann am Effizientesten, wenn man ein Pivot-Element wählt, welches am Schluss genau in der Mitte zu liegen kommt (im Beispiel die 6 oder die 7). Leider ist dieses Element nicht ganz einfach zu finden.&lt;br /&gt;
&lt;br /&gt;
Man sollte deshalb nicht immer wie im Beispiel das erste Element als Pivot wählen. Dies ist zwar leicht zu implementieren, allerdings führt dies zu einem langsamen &amp;quot;QuickSort&amp;quot;, falls  das Array bereits sortiert ist, oder nahezu sortiert ist.&lt;br /&gt;
&lt;br /&gt;
Als Kompromiss wird oft ein zufälliges Element als Pivot-Element genommen. Noch besser kann es sein, von drei zufällig gewählten Elementen jeweils das mittlere zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Java Implementierung ==&lt;br /&gt;
Bisher wurde die allgemeine Funktionsweise des Quicksorts beschrieben. Am Besten lassen sich komplexe [[Algorithmus|Algorithmen]] nachvollziehen, wenn Sie anhand einer Implementierung mit Hilfe eines [[Debugger|Debuggers]] analysiert werden.  Mit Hilfe des Quicksorts können beliebige Datenstrukturen sortiert werden. In der folgenden [[Java]] Implementierung wird ein [[Array]] bestehend aus Integern (kurz int) sortiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void quickSort(int array[], int links, int rechts) {&lt;br /&gt;
      if (links &amp;lt; rechts) {&lt;br /&gt;
         int i = teile(array,links,rechts);&lt;br /&gt;
         quickSort(array,links,i-1);&lt;br /&gt;
         quickSort(array,i+1,rechts);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public  int teile(int array[], int links, int rechts) {&lt;br /&gt;
      int pivot, i, j, help;&lt;br /&gt;
      pivot = array[rechts];               &lt;br /&gt;
      i     = links;&lt;br /&gt;
      j     = rechts-1;&lt;br /&gt;
      while(i&amp;lt;=j) {&lt;br /&gt;
         if (array[i] &amp;gt; pivot) {     &lt;br /&gt;
            // tausche x[i] und x[j]&lt;br /&gt;
            help = array[i]; &lt;br /&gt;
            array[i] = array[j]; &lt;br /&gt;
            array[j] = help;                             &lt;br /&gt;
&lt;br /&gt;
            j--;&lt;br /&gt;
         } else i++;            &lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // tausche x[i] und x[rechts]&lt;br /&gt;
      help      = array[i];&lt;br /&gt;
      array[i]      = array[rechts];&lt;br /&gt;
      array[rechts] = help;&lt;br /&gt;
      return i;&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Datei:Rekursive_Baumstruktur.jpg&amp;diff=2712</id>
		<title>Datei:Rekursive Baumstruktur.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Datei:Rekursive_Baumstruktur.jpg&amp;diff=2712"/>
		<updated>2026-02-20T07:50:20Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rekursive Baumstruktur&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2711</id>
		<title>Quicksort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Quicksort&amp;diff=2711"/>
		<updated>2026-02-20T07:47:23Z</updated>

		<summary type="html">&lt;p&gt;Thomas: Die Seite wurde neu angelegt: „== Einführung == Ein oft eingesetzter Sortier-Algorithmus ist der Quicksort. Der Quicksort funktioniert nach dem Prinzip »teile und herrsche«, was mit Hilfe der Rekursion realisiert wird. Die zu sortierenden Daten werden immer in zwei Teile zerlegt (&amp;quot;Teile&amp;quot;) und wieder sortiert (&amp;quot;Herrsche&amp;quot;)). Diese zwei Teile werden wiederum jeweils in zwei Teile zerlegt und sortiert usw., bis die Daten sortiert sind. Die Rekursion beendet sic…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Ein oft eingesetzter [[Sortieren|Sortier]]-Algorithmus ist der Quicksort. Der Quicksort funktioniert nach dem Prinzip »teile und herrsche«, was mit Hilfe der [[Rekursion]] realisiert wird. Die zu sortierenden [[Daten]] werden immer in zwei Teile zerlegt (&amp;quot;Teile&amp;quot;) und wieder sortiert (&amp;quot;Herrsche&amp;quot;)). Diese zwei Teile werden wiederum jeweils in zwei Teile zerlegt und sortiert usw., bis die Daten sortiert sind. Die [[Rekursion]] beendet sich, wenn das Teilstück aus nur noch einem Element besteht (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm#mj035bded10a26be556df779f234784e89).&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2710</id>
		<title>Sortieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Sortieren&amp;diff=2710"/>
		<updated>2026-02-20T07:45:44Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführung&lt;br /&gt;
Ein übliches Problem in der Informatik  ist es, Daten zu sortieren. Wer das Sortieren verstanden hat, dem wird es nicht schwerfallen, andere Algorithmen zu verstehen. Das Sortieren könnte man sozusagen auch als »Basics für Algorithmen« bezeichnen.&lt;br /&gt;
[[Datei:Sortiertes kartenspiel.png|mini]]&lt;br /&gt;
&lt;br /&gt;
Primär geht es darum, die einzelnen Sortierverfahren näherzubringen, speziell deren Funktionen. Die Implementierung ist zumeist problemabhängig und richtet sich nach der Art der Daten, die es zu sortieren gilt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).Es gibt unterschiedliche Algorithmen für ein gegebenes Problem und so gibt es  verschiedene Sortierverfahren. Jeder Algorithmus arbeitet unterschiedlich effizient, um ein Problem zu lösen. Die Zeitkomplexität eines Sortieralgorithmus gibt an, wie viele Operationen nötig sind, um einen Sortiervorgang abzuschließen. Bei gegebenen Hardwareausstattung lässt sich also messen, wie lange ein Sortiervorgang dauert.&lt;br /&gt;
&lt;br /&gt;
== Platzkomplexität – In-place ==&lt;br /&gt;
Zusätzlich wird die Platzkomplexität eines Sortierverfahrens betrachtet. Hier wird analysiert, ob und wie viel zusätzlicher Speicher für den Sortiervorgang an sich benötigt wird. Bei in-Place wird nur eine konstante Menge an zusätzlichem Speicher benötigt z.B. Hilfsvariablen für den Dreieckstausch. Bei out-of-place wird eine dynamische Anzahl von zusätzlichem Speicher benötigt die abhängig von der Eingabegröße ist. &lt;br /&gt;
&lt;br /&gt;
== Vergleichsbasierte Verfahren ==&lt;br /&gt;
Sortierverfahren können sich allgemein durch die Basis der Arbeitsweise unterscheiden. Zum einen können Sortieralgorithmen vergleichsbasiert arbeiten oder eben nicht. Das heißt, dass ein Teil der Sortieralgorithmen Vergleiche von Elementen der Liste verwendet, um die Elemente entsprechend in die richtige Reihenfolge zu tauschen. Beim nicht vergleichsbasierten Verfahren liegt der Fokus auf der konditionierten Eingabe.  Im Folgenden werden die vergleichsbasierten sortierverfahren behandelt.&lt;br /&gt;
&lt;br /&gt;
== Stabilität ==&lt;br /&gt;
&lt;br /&gt;
Zusätzliche kann zwischen stabilem und instabilem Verfahren unterschieden werden. Bei stabile Verfahren bleibt die Reihenfolge der Datensätze gleich, deren Sortierschlüssel auch gleich sind. Angenommen man möchte in einem Verein die bereits alphabetisch geordnete Mitglieder nach dem Geburtsdatum sortieren. Stabile Verfahren sorgen dafür, dass die Mitglieder mit gleichem Geburtsdatum weiterhin noch nach der alphabetischen Reihenfolge sortiert bleiben. Das Verfahren sortiert in erster Priorität nach dem Geburtsdatum und in zweiter Priorität  nach alphabetische Reihenfolge.&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Name&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Laufzeit&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Platzkomplexität&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Stabil&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | In-Place&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Vergleichs-orientiert&lt;br /&gt;
|-&lt;br /&gt;
! Best-Case !! Average-Case !! Worst-Case !! Best-Case !! Average-Case !! Worst-Case&lt;br /&gt;
|-&lt;br /&gt;
| [[Bubble-sort|Bubble Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| [[Insertion-sort|Insertion Sort]]&lt;br /&gt;
| O(n) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| ja || ja || ja&lt;br /&gt;
|-&lt;br /&gt;
| Quicksort&lt;br /&gt;
| O(n log n) || O(n log n) || O(n²)&lt;br /&gt;
| O(log n) || O(log n) || O(n)&lt;br /&gt;
| nein || ja/nein || ja&lt;br /&gt;
|-&lt;br /&gt;
| Selection Sort&lt;br /&gt;
| O(n²) || O(n²) || O(n²)&lt;br /&gt;
| O(1) || O(1) || O(1)&lt;br /&gt;
| nein || ja || ja&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2709</id>
		<title>Insertionsort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2709"/>
		<updated>2026-02-20T07:44:57Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Pseudo Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführung&lt;br /&gt;
Der [[Algorithmus]] dieses [[Sortieren|Sortierverfahrens]] ist relative simpel. Das Prinzip von Insertion Sort ist: Die einzelnen Elemente werden von vorne nach hinten durchlaufen. Von der aktuellen Position aus wird jedes Element von rechts nach links weitergereicht – und das so lange, bis das bewegte Element größer oder gleich dem Element ist, das an der im Augenblick abgefragten Position liegt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).&lt;br /&gt;
&lt;br /&gt;
Der Platz für das Element, das verschoben wird, ist frei. Diese Lücke wird mit dem entsprechenden Wert an der richtigen Stelle gefüllt.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[Datei:Animation Insertio-Sort.gif|mini]]&lt;br /&gt;
Die folgende Tabelle zeigt die Sortier­schritte zum Sortieren der Folge 5 7 0 3 4 2 6 1. Auf der linken Seite grün dargestellt befindet sich jeweils der bereits sortierte Teil der Folge. Die blauen Ziffern repräsentieren den unsortierten Teil der Zahlenfolge. Ganz rechts steht in Klammern die Anzahl der Positionen, um die das eingefügte Element nach links gewandert ist. Das aktuell eingefügte Element ist fett markiert. (http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/insert/insertion.htm).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; font-family:monospace;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (4)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (1)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || (6)&lt;br /&gt;
|}&lt;br /&gt;
== Pseudo Code ==&lt;br /&gt;
Der [[Algorithmus]] sieht im Pseudocode so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight line&amp;gt;&lt;br /&gt;
prozedur INSERTIONSORT(A ist Liste sortierbarer Elemente)&lt;br /&gt;
  wiederhole bis zur Länge von A und beginne beim 2. Element&lt;br /&gt;
  einzusortierender_wert = A an der Stelle i&lt;br /&gt;
  j = i&lt;br /&gt;
    wiederhole solange j &amp;gt; 1 und A an der Stelle j-1 &amp;gt; einzusortierender_wert&lt;br /&gt;
      A an der Stelle j = A an der Stelle j-1&lt;br /&gt;
      j = j − 1&lt;br /&gt;
    ende wiederhole&lt;br /&gt;
   A an der Stelle j = einzusortierender_wert&lt;br /&gt;
  ende wiederhole&lt;br /&gt;
ende prozedur&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
=== Worst Case ===&lt;br /&gt;
Eine sortierte Liste in umgekehrter Reihenfolge ist das Worst Case Szenario für den InsertionSort:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;[11,7,5,3,2,0]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir betrachten nur die Vergleichsoperationen, die wir mit der Variable c messen. Die Anzahl der zu sortierenden Elemente ist entspricht n. &lt;br /&gt;
&lt;br /&gt;
Beim ersten äußeren Schleifendurchlauf ist c = 1. Denn wir müssen nur die Zahl 7 mit der Zahl 11 vergleichen. 7 wird einsortiert und es bildet sich der bereits sortierte Teil (siehe oben) der Datenstruktur.  Beim zweiten Durchlauf der äußeren Schleife benötigen wir zwei Vergleiche , c = 2. Beim dritte Mal, c = 3 bis zum letzten Mal, wenn c = n-1. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅1+c⋅2+c⋅3+⋯c⋅(n−1)=c⋅(1+2+3+⋯+(n−1))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um eine [[Arithmetische-reihe|arithmetische Reihe]], mit der Ausnahme, dass sie bis zu n-1 anstatt n ansteigt. Unter Verwendung unserer Formel für [[Arithmetische-reihe|arithmetische Reihen]], erhalten wir:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅(n−1+1)*((n−1)/2)=cn​2​​/2 − cn/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für sehr große n können   wir den niederwertigen Term &amp;lt;math&amp;gt;cn/2 &amp;lt;/math&amp;gt; und die konstanten Faktoren c und 1/2 verwerfen, so dass gilt:&lt;br /&gt;
&lt;br /&gt;
Der InsertionSort liegt hier in der  Komplexitätsklasse &amp;lt;math&amp;gt;O(n​2​​)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Best Case ===&lt;br /&gt;
Die optimale Eingabe ist ein bereits sortiertes Array. In diesem Fall hat Insertion Sort eine lineare Laufzeit (d. h. &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;). Während jeder Iteration wird das erste verbleibende Element der Eingabe nur mit dem Element ganz rechts des sortierten Unterabschnitts des Arrays verglichen.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2707</id>
		<title>Insertionsort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2707"/>
		<updated>2026-02-18T13:39:29Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Best Case */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführung&lt;br /&gt;
Der [[Algorithmus]] dieses [[Sortieren|Sortierverfahrens]] ist relative simpel. Das Prinzip von Insertion Sort ist: Die einzelnen Elemente werden von vorne nach hinten durchlaufen. Von der aktuellen Position aus wird jedes Element von rechts nach links weitergereicht – und das so lange, bis das bewegte Element größer oder gleich dem Element ist, das an der im Augenblick abgefragten Position liegt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).&lt;br /&gt;
&lt;br /&gt;
Der Platz für das Element, das verschoben wird, ist frei. Diese Lücke wird mit dem entsprechenden Wert an der richtigen Stelle gefüllt.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[Datei:Animation Insertio-Sort.gif|mini]]&lt;br /&gt;
Die folgende Tabelle zeigt die Sortier­schritte zum Sortieren der Folge 5 7 0 3 4 2 6 1. Auf der linken Seite grün dargestellt befindet sich jeweils der bereits sortierte Teil der Folge. Die blauen Ziffern repräsentieren den unsortierten Teil der Zahlenfolge. Ganz rechts steht in Klammern die Anzahl der Positionen, um die das eingefügte Element nach links gewandert ist. Das aktuell eingefügte Element ist fett markiert. (http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/insert/insertion.htm).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; font-family:monospace;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (4)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (1)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || (6)&lt;br /&gt;
|}&lt;br /&gt;
== Pseudo Code ==&lt;br /&gt;
Der Algorithmus sieht im Pseudocode so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight line&amp;gt;&lt;br /&gt;
prozedur INSERTIONSORT(A ist Liste sortierbarer Elemente)&lt;br /&gt;
  wiederhole bis zur Länge von A und beginne beim 2. Element&lt;br /&gt;
  einzusortierender_wert = A an der Stelle i&lt;br /&gt;
  j = i&lt;br /&gt;
    wiederhole solange j &amp;gt; 1 und A an der Stelle j-1 &amp;gt; einzusortierender_wert&lt;br /&gt;
      A an der Stelle j = A an der Stelle j-1&lt;br /&gt;
      j = j − 1&lt;br /&gt;
    ende wiederhole&lt;br /&gt;
   A an der Stelle j = einzusortierender_wert&lt;br /&gt;
  ende wiederhole&lt;br /&gt;
ende prozedur&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
=== Worst Case ===&lt;br /&gt;
Eine sortierte Liste in umgekehrter Reihenfolge ist das Worst Case Szenario für den InsertionSort:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;[11,7,5,3,2,0]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir betrachten nur die Vergleichsoperationen, die wir mit der Variable c messen. Die Anzahl der zu sortierenden Elemente ist entspricht n. &lt;br /&gt;
&lt;br /&gt;
Beim ersten äußeren Schleifendurchlauf ist c = 1. Denn wir müssen nur die Zahl 7 mit der Zahl 11 vergleichen. 7 wird einsortiert und es bildet sich der bereits sortierte Teil (siehe oben) der Datenstruktur.  Beim zweiten Durchlauf der äußeren Schleife benötigen wir zwei Vergleiche , c = 2. Beim dritte Mal, c = 3 bis zum letzten Mal, wenn c = n-1. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅1+c⋅2+c⋅3+⋯c⋅(n−1)=c⋅(1+2+3+⋯+(n−1))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um eine [[Arithmetische-reihe|arithmetische Reihe]], mit der Ausnahme, dass sie bis zu n-1 anstatt n ansteigt. Unter Verwendung unserer Formel für [[Arithmetische-reihe|arithmetische Reihen]], erhalten wir:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅(n−1+1)*((n−1)/2)=cn​2​​/2 − cn/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für sehr große n können   wir den niederwertigen Term &amp;lt;math&amp;gt;cn/2 &amp;lt;/math&amp;gt; und die konstanten Faktoren c und 1/2 verwerfen, so dass gilt:&lt;br /&gt;
&lt;br /&gt;
Der InsertionSort liegt hier in der  Komplexitätsklasse &amp;lt;math&amp;gt;O(n​2​​)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Best Case ===&lt;br /&gt;
Die optimale Eingabe ist ein bereits sortiertes Array. In diesem Fall hat Insertion Sort eine lineare Laufzeit (d. h. &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;). Während jeder Iteration wird das erste verbleibende Element der Eingabe nur mit dem Element ganz rechts des sortierten Unterabschnitts des Arrays verglichen.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2706</id>
		<title>Insertionsort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2706"/>
		<updated>2026-02-18T13:39:13Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Worst Case */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführung&lt;br /&gt;
Der [[Algorithmus]] dieses [[Sortieren|Sortierverfahrens]] ist relative simpel. Das Prinzip von Insertion Sort ist: Die einzelnen Elemente werden von vorne nach hinten durchlaufen. Von der aktuellen Position aus wird jedes Element von rechts nach links weitergereicht – und das so lange, bis das bewegte Element größer oder gleich dem Element ist, das an der im Augenblick abgefragten Position liegt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).&lt;br /&gt;
&lt;br /&gt;
Der Platz für das Element, das verschoben wird, ist frei. Diese Lücke wird mit dem entsprechenden Wert an der richtigen Stelle gefüllt.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[Datei:Animation Insertio-Sort.gif|mini]]&lt;br /&gt;
Die folgende Tabelle zeigt die Sortier­schritte zum Sortieren der Folge 5 7 0 3 4 2 6 1. Auf der linken Seite grün dargestellt befindet sich jeweils der bereits sortierte Teil der Folge. Die blauen Ziffern repräsentieren den unsortierten Teil der Zahlenfolge. Ganz rechts steht in Klammern die Anzahl der Positionen, um die das eingefügte Element nach links gewandert ist. Das aktuell eingefügte Element ist fett markiert. (http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/insert/insertion.htm).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; font-family:monospace;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (4)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (1)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || (6)&lt;br /&gt;
|}&lt;br /&gt;
== Pseudo Code ==&lt;br /&gt;
Der Algorithmus sieht im Pseudocode so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight line&amp;gt;&lt;br /&gt;
prozedur INSERTIONSORT(A ist Liste sortierbarer Elemente)&lt;br /&gt;
  wiederhole bis zur Länge von A und beginne beim 2. Element&lt;br /&gt;
  einzusortierender_wert = A an der Stelle i&lt;br /&gt;
  j = i&lt;br /&gt;
    wiederhole solange j &amp;gt; 1 und A an der Stelle j-1 &amp;gt; einzusortierender_wert&lt;br /&gt;
      A an der Stelle j = A an der Stelle j-1&lt;br /&gt;
      j = j − 1&lt;br /&gt;
    ende wiederhole&lt;br /&gt;
   A an der Stelle j = einzusortierender_wert&lt;br /&gt;
  ende wiederhole&lt;br /&gt;
ende prozedur&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
=== Worst Case ===&lt;br /&gt;
Eine sortierte Liste in umgekehrter Reihenfolge ist das Worst Case Szenario für den InsertionSort:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;[11,7,5,3,2,0]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir betrachten nur die Vergleichsoperationen, die wir mit der Variable c messen. Die Anzahl der zu sortierenden Elemente ist entspricht n. &lt;br /&gt;
&lt;br /&gt;
Beim ersten äußeren Schleifendurchlauf ist c = 1. Denn wir müssen nur die Zahl 7 mit der Zahl 11 vergleichen. 7 wird einsortiert und es bildet sich der bereits sortierte Teil (siehe oben) der Datenstruktur.  Beim zweiten Durchlauf der äußeren Schleife benötigen wir zwei Vergleiche , c = 2. Beim dritte Mal, c = 3 bis zum letzten Mal, wenn c = n-1. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅1+c⋅2+c⋅3+⋯c⋅(n−1)=c⋅(1+2+3+⋯+(n−1))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um eine [[Arithmetische-reihe|arithmetische Reihe]], mit der Ausnahme, dass sie bis zu n-1 anstatt n ansteigt. Unter Verwendung unserer Formel für [[Arithmetische-reihe|arithmetische Reihen]], erhalten wir:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅(n−1+1)*((n−1)/2)=cn​2​​/2 − cn/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für sehr große n können   wir den niederwertigen Term &amp;lt;math&amp;gt;cn/2 &amp;lt;/math&amp;gt; und die konstanten Faktoren c und 1/2 verwerfen, so dass gilt:&lt;br /&gt;
&lt;br /&gt;
Der InsertionSort liegt hier in der  Komplexitätsklasse &amp;lt;math&amp;gt;O(n​2​​)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Best Case ===&lt;br /&gt;
Die optimale Eingabe ist ein bereits sortiertes Array. In diesem Fall hat Insertion Sort eine lineare Laufzeit (d. h. O(n)). Während jeder Iteration wird das erste verbleibende Element der Eingabe nur mit dem Element ganz rechts des sortierten Unterabschnitts des Arrays verglichen.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2705</id>
		<title>Insertionsort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2705"/>
		<updated>2026-02-18T13:38:29Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Worst Case */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführung&lt;br /&gt;
Der [[Algorithmus]] dieses [[Sortieren|Sortierverfahrens]] ist relative simpel. Das Prinzip von Insertion Sort ist: Die einzelnen Elemente werden von vorne nach hinten durchlaufen. Von der aktuellen Position aus wird jedes Element von rechts nach links weitergereicht – und das so lange, bis das bewegte Element größer oder gleich dem Element ist, das an der im Augenblick abgefragten Position liegt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).&lt;br /&gt;
&lt;br /&gt;
Der Platz für das Element, das verschoben wird, ist frei. Diese Lücke wird mit dem entsprechenden Wert an der richtigen Stelle gefüllt.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[Datei:Animation Insertio-Sort.gif|mini]]&lt;br /&gt;
Die folgende Tabelle zeigt die Sortier­schritte zum Sortieren der Folge 5 7 0 3 4 2 6 1. Auf der linken Seite grün dargestellt befindet sich jeweils der bereits sortierte Teil der Folge. Die blauen Ziffern repräsentieren den unsortierten Teil der Zahlenfolge. Ganz rechts steht in Klammern die Anzahl der Positionen, um die das eingefügte Element nach links gewandert ist. Das aktuell eingefügte Element ist fett markiert. (http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/insert/insertion.htm).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; font-family:monospace;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (4)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (1)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || (6)&lt;br /&gt;
|}&lt;br /&gt;
== Pseudo Code ==&lt;br /&gt;
Der Algorithmus sieht im Pseudocode so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight line&amp;gt;&lt;br /&gt;
prozedur INSERTIONSORT(A ist Liste sortierbarer Elemente)&lt;br /&gt;
  wiederhole bis zur Länge von A und beginne beim 2. Element&lt;br /&gt;
  einzusortierender_wert = A an der Stelle i&lt;br /&gt;
  j = i&lt;br /&gt;
    wiederhole solange j &amp;gt; 1 und A an der Stelle j-1 &amp;gt; einzusortierender_wert&lt;br /&gt;
      A an der Stelle j = A an der Stelle j-1&lt;br /&gt;
      j = j − 1&lt;br /&gt;
    ende wiederhole&lt;br /&gt;
   A an der Stelle j = einzusortierender_wert&lt;br /&gt;
  ende wiederhole&lt;br /&gt;
ende prozedur&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
=== Worst Case ===&lt;br /&gt;
Eine sortierte Liste in umgekehrter Reihenfolge ist das Worst Case Szenario für den InsertionSort:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;[11,7,5,3,2,0]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir betrachten nur die Vergleichsoperationen, die wir mit der Variable c messen. Die Anzahl der zu sortierenden Elemente ist entspricht n. &lt;br /&gt;
&lt;br /&gt;
Beim ersten äußeren Schleifendurchlauf ist c = 1. Denn wir müssen nur die Zahl 7 mit der Zahl 11 vergleichen. 7 wird einsortiert und es bildet sich der bereits sortierte Teil (siehe oben) der Datenstruktur.  Beim zweiten Durchlauf der äußeren Schleife benötigen wir zwei Vergleiche , c = 2. Beim dritte Mal, c = 3 bis zum letzten Mal, wenn c = n-1. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅1+c⋅2+c⋅3+⋯c⋅(n−1)=c⋅(1+2+3+⋯+(n−1))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um eine [[Arithmetische-reihe|arithmetische Reihe]], mit der Ausnahme, dass sie bis zu n-1 anstatt n ansteigt. Unter Verwendung unserer Formel für [[Arithmetische-reihe|arithmetische Reihen]], erhalten wir:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c⋅(n−1+1)*((n−1)/2)=cn​2​​/2 − cn/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für sehr große n können   wir den niederwertigen Term cn/2  und die konstanten Faktoren c und 1/2 verwerfen, so dass gilt:&lt;br /&gt;
&lt;br /&gt;
Der InsertionSort liegt hier in der  Komplexitätsklasse O(n​2​​)&lt;br /&gt;
&lt;br /&gt;
=== Best Case ===&lt;br /&gt;
Die optimale Eingabe ist ein bereits sortiertes Array. In diesem Fall hat Insertion Sort eine lineare Laufzeit (d. h. O(n)). Während jeder Iteration wird das erste verbleibende Element der Eingabe nur mit dem Element ganz rechts des sortierten Unterabschnitts des Arrays verglichen.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2704</id>
		<title>Insertionsort</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Insertionsort&amp;diff=2704"/>
		<updated>2026-02-18T13:37:46Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Komplexität */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführung&lt;br /&gt;
Der [[Algorithmus]] dieses [[Sortieren|Sortierverfahrens]] ist relative simpel. Das Prinzip von Insertion Sort ist: Die einzelnen Elemente werden von vorne nach hinten durchlaufen. Von der aktuellen Position aus wird jedes Element von rechts nach links weitergereicht – und das so lange, bis das bewegte Element größer oder gleich dem Element ist, das an der im Augenblick abgefragten Position liegt (http://openbook.galileocomputing.de/c_von_a_bis_z/022_c_algorithmen_003.htm).&lt;br /&gt;
&lt;br /&gt;
Der Platz für das Element, das verschoben wird, ist frei. Diese Lücke wird mit dem entsprechenden Wert an der richtigen Stelle gefüllt.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[Datei:Animation Insertio-Sort.gif|mini]]&lt;br /&gt;
Die folgende Tabelle zeigt die Sortier­schritte zum Sortieren der Folge 5 7 0 3 4 2 6 1. Auf der linken Seite grün dargestellt befindet sich jeweils der bereits sortierte Teil der Folge. Die blauen Ziffern repräsentieren den unsortierten Teil der Zahlenfolge. Ganz rechts steht in Klammern die Anzahl der Positionen, um die das eingefügte Element nach links gewandert ist. Das aktuell eingefügte Element ist fett markiert. (http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/insert/insertion.htm).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; font-family:monospace;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (0)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (2)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (4)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; || (1)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; || &#039;&#039;&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&#039;&#039;&#039;&#039;&#039; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;6&amp;lt;/span&amp;gt; || &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt; || (6)&lt;br /&gt;
|}&lt;br /&gt;
== Pseudo Code ==&lt;br /&gt;
Der Algorithmus sieht im Pseudocode so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight line&amp;gt;&lt;br /&gt;
prozedur INSERTIONSORT(A ist Liste sortierbarer Elemente)&lt;br /&gt;
  wiederhole bis zur Länge von A und beginne beim 2. Element&lt;br /&gt;
  einzusortierender_wert = A an der Stelle i&lt;br /&gt;
  j = i&lt;br /&gt;
    wiederhole solange j &amp;gt; 1 und A an der Stelle j-1 &amp;gt; einzusortierender_wert&lt;br /&gt;
      A an der Stelle j = A an der Stelle j-1&lt;br /&gt;
      j = j − 1&lt;br /&gt;
    ende wiederhole&lt;br /&gt;
   A an der Stelle j = einzusortierender_wert&lt;br /&gt;
  ende wiederhole&lt;br /&gt;
ende prozedur&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
=== Worst Case ===&lt;br /&gt;
Eine sortierte Liste in umgekehrter Reihenfolge ist das Worst Case Szenario für den InsertionSort:&lt;br /&gt;
&lt;br /&gt;
[11,7,5,3,2,0]&lt;br /&gt;
&lt;br /&gt;
Wir betrachten nur die Vergleichsoperationen, die wir mit der Variable c messen. Die Anzahl der zu sortierenden Elemente ist entspricht n. &lt;br /&gt;
&lt;br /&gt;
Beim ersten äußeren Schleifendurchlauf ist c = 1. Denn wir müssen nur die Zahl 7 mit der Zahl 11 vergleichen. 7 wird einsortiert und es bildet sich der bereits sortierte Teil (siehe oben) der Datenstruktur.  Beim zweiten Durchlauf der äußeren Schleife benötigen wir zwei Vergleiche , c = 2. Beim dritte Mal, c = 3 bis zum letzten Mal, wenn c = n-1. Es gilt also:&lt;br /&gt;
&lt;br /&gt;
c⋅1+c⋅2+c⋅3+⋯c⋅(n−1)=c⋅(1+2+3+⋯+(n−1))&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um eine [[Arithmetische-reihe|arithmetische Reihe]], mit der Ausnahme, dass sie bis zu n-1 anstatt n ansteigt. Unter Verwendung unserer Formel für [[Arithmetische-reihe|arithmetische Reihen]], erhalten wir:&lt;br /&gt;
&lt;br /&gt;
c⋅(n−1+1)*((n−1)/2)=cn​2​​/2 − cn/2&lt;br /&gt;
&lt;br /&gt;
Für sehr große n können   wir den niederwertigen Term cn/2  und die konstanten Faktoren c und 1/2 verwerfen, so dass gilt:&lt;br /&gt;
&lt;br /&gt;
Der InsertionSort liegt hier in der  Komplexitätsklasse O(n​2​​)&lt;br /&gt;
&lt;br /&gt;
=== Best Case ===&lt;br /&gt;
Die optimale Eingabe ist ein bereits sortiertes Array. In diesem Fall hat Insertion Sort eine lineare Laufzeit (d. h. O(n)). Während jeder Iteration wird das erste verbleibende Element der Eingabe nur mit dem Element ganz rechts des sortierten Unterabschnitts des Arrays verglichen.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Arithmetische-reihe&amp;diff=2703</id>
		<title>Arithmetische-reihe</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Arithmetische-reihe&amp;diff=2703"/>
		<updated>2026-02-18T13:36:08Z</updated>

		<summary type="html">&lt;p&gt;Thomas: Die Seite wurde neu angelegt: „== Einführung == Die gaußsche Summenformel, auch kleiner Gauß genannt, ist eine Formel für die Summe der ersten  aufeinanderfolgenden natürlichen Zahlen (Quelle: https://de.wikipedia.org/wiki/Gau%C3%9Fsche_Summenformel) :  &amp;lt;math&amp;gt;0 + 1 + 2 + 3 + 4 + \dots + n = \sum_{k=0}^{n} k = \frac{n(n+1)}{2} = \frac{n^2+n}{2}&amp;lt;/math&amp;gt;  Diese Summenformel wie auch die Summenformel für die ersten Quadratzahlen war bereits in der vorgriechischen Mathematik bekannt.…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Die gaußsche Summenformel, auch kleiner Gauß genannt, ist eine Formel für die Summe der ersten&lt;br /&gt;
&lt;br /&gt;
aufeinanderfolgenden natürlichen Zahlen (Quelle: https://de.wikipedia.org/wiki/Gau%C3%9Fsche_Summenformel) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;0 + 1 + 2 + 3 + 4 + \dots + n = \sum_{k=0}^{n} k = \frac{n(n+1)}{2} = \frac{n^2+n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Summenformel wie auch die Summenformel für die ersten Quadratzahlen war bereits in der vorgriechischen Mathematik bekannt.&lt;br /&gt;
&lt;br /&gt;
Carl Friedrich Gauß entdeckte diese Formel als neunjähriger Schüler wieder. Die Geschichte ist durch Wolfgang Sartorius von Waltershausen überliefert:&lt;br /&gt;
&lt;br /&gt;
„Der junge Gauss war kaum in die Rechenclasse eingetreten, als Büttner die Summation einer arithmetischen Reihe aufgab. Die Aufgabe war indess kaum ausgesprochen als Gauss die Tafel mit den im niedern Braunschweiger Dialekt gesprochenen Worten auf den Tisch wirft: »Ligget se’.« (Da liegt sie.)“&lt;br /&gt;
&lt;br /&gt;
– Wolfgang Sartorius von Waltershausen&lt;br /&gt;
&lt;br /&gt;
== Erklärung ==&lt;br /&gt;
Wie berechnet man die Summe 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 möglichst schnell?  Man vertauscht die Reihenfolge der Summanden wie folgt: Zuerst addieren wir 8 + 1, die größten und kleinsten Werte. Dann berechnen wir 7 + 2, die zweitgrößten und zweitkleinsten Werte. Das Ergebnis in beiden Fällen 9. Wie wäre es mit 6 + 3 ? Auch 9. Zuletzt, 5 + 4. Noch einmal 9!  Das Ergebnis:&lt;br /&gt;
&lt;br /&gt;
​&amp;lt;math&amp;gt;(8+1)+(7+2)+(6+3)+(5+4)​​​​​= 9 + 9 + 9 + 9​ = 4 * 9 ​= 36 .&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt vier Paare von Zahlen, die sich jeweils zu 9 addieren. Allgemein kann man mit zwei Schritten jede Folge von aufeinander folgenden Ganzzahlen zusammenzufassen:&lt;br /&gt;
&lt;br /&gt;
Füge die kleinste und die größte Zahl hinzu.&lt;br /&gt;
&lt;br /&gt;
Multiplizieren Sie mit der Anzahl der Paare.&lt;br /&gt;
&lt;br /&gt;
Dies gilt auch für ungleiche Paare. Zählen Sie einfach die ungepaarte Zahl in der Mitte der Sequenz als ein halbes Paar. Ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
​&amp;lt;math&amp;gt;1 + 2 + 3 + 4 + 5&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei volle Paare 1 + 5 und 2 + 4, jeweils summierend auf 6 und ein halbes Paar 3,die Hälfte von 6. Was insgesamt 2,5 Paare ergibt: &lt;br /&gt;
&lt;br /&gt;
​&amp;lt;math&amp;gt;2.5 * 6 = 15 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allgemein gilt die Summe der kleinsten und größten Summanden  ist n + 1 . Da es n Zahlen insgesamt gibt, gibt es n / 2 Paare (ob n ungerade oder gerade ist) . Daher ist die Summe der Zahlen von 1 bis n :&lt;br /&gt;
&lt;br /&gt;
​&amp;lt;math&amp;gt;(n + 1) * (n / 2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies entspricht &lt;br /&gt;
&lt;br /&gt;
​&amp;lt;math&amp;gt;n​²​​/2 + n/2&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>
	</entry>
</feed>