<?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-11-05T12:25:04Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://wiki.flbk-hamm.de/index.php?title=Methode&amp;diff=3006</id>
		<title>Methode</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Methode&amp;diff=3006"/>
		<updated>2026-10-05T08:50:00Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einstieg ==&lt;br /&gt;
[[Objekt|Objekte]] bestehen aus [[Attribut|Attributen]] und Methoden. [[Attribut|Attribute]] sind nur Variablen und [[Konstante|Konstanten]], die Werte aufnehmen können, und beschreiben damit den [[Zustand]] des [[Objekt|Objektes]]. Im Gegensatz dazu gibt es die „Methoden“, die das dynamische Verhalten des Objektes oder einer [[Klasse]] definieren. Sie enthalten die [[Algorithmus|Algorithmen]] eines Objektes.&lt;br /&gt;
&lt;br /&gt;
Methoden sind in der [[Objektorientierung|objektorientierten]] Programmierung Unterprogramme, die das [[Verhalten]] von Objekten beschreiben und implementieren. Durch Methoden des Objekts können andere Objekte mit diesem [[Objekt]] über Nachrichten in Verbindung treten.&lt;br /&gt;
&lt;br /&gt;
Neben der Bindung einer Methode an ein Objekt (also der [[Instanz]] einer [[Klasse]]), gibt die Möglichkeit Methoden direkt ohne Instanzen auszuführen. Solchen Methoden nennt man statisch (&#039;&#039;static&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
Eine Methode muss im [[Körper]] einer [[Klasse]] stehen und besteht aus einem [[Kopf]] und einem Körper. Der Kopf besteht aus der [[Sichtbarkeit]] und einer [[Methodensignatur|Signatur]]. Die Signatur besteht aus einem [[Rückgabeparameter]], dem Methodennamen und [[Eingabeparametern]]. Die Reihenfolge dieser Elemente ist für den [[Compiler]] entscheidend.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kopf ===&lt;br /&gt;
Der Kopf einer Methode besteht aus der [[Sichtbarkeit]] und der [[Methodensignatur|Signatur]] plus Rückgabeparameter.&lt;br /&gt;
&lt;br /&gt;
==== Sichtbarkeit ====&lt;br /&gt;
Die Sichtbarkeit gibt an, wer auf die Methode zugreifen darf.&lt;br /&gt;
===== private =====&lt;br /&gt;
Die Sichtbarkeit private besagt, dass nur innerhalb einer [[Klasse]] bzw. [[Instanz]] auf eine Methode zugegriffen werden darf.&lt;br /&gt;
&lt;br /&gt;
===== public =====&lt;br /&gt;
Die Sichtbarkeit public macht die Methode öffentlich zugänglich. Hier gibt es keine Einschränkung.&lt;br /&gt;
&lt;br /&gt;
===== protected =====&lt;br /&gt;
Die Sichtbarkeit protected ermöglicht den Zugriff innerhalb der [[Klasse]] selbst, aller Klassen eines [[Package|Packages]] (im [[Projekt]]) und ihrer [[Vererbung|erbenden]] Kinderklassen.&lt;br /&gt;
&lt;br /&gt;
===== default =====&lt;br /&gt;
Wird keine Angabe zur Sichtbarkeit gemacht, können alle Klassen eines Packages (im [[Projekt]]) zugreifen. &lt;br /&gt;
&lt;br /&gt;
==== Signatur ====&lt;br /&gt;
&lt;br /&gt;
Eine [[Methodensignatur|Signatur]](oder Methodensignatur) definiert in der Programmierung die Schnittstelle einer Methode. Sie besteht aus dem Namen der Methode und der Anzahl und Reihenfolge der [[Eingabeparameter]]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Methodenname ====&lt;br /&gt;
&lt;br /&gt;
Der Methodenname ist freiwählbar. In der objektorientierten Softwareentwicklung ist es üblich Methodennamen mit einem Verb zu benennen. Hierdurch wird deutlich, dass die Methode Verhalten repräsentiert. So ist der Quelltext leichter zu lesen und zu verstehen.&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
===== Rückgabeparameter =====&lt;br /&gt;
&lt;br /&gt;
Der Rückgabeparameter definiert den (Daten)-Typen möglicher Ergebnisse dieser Methode. Das Ergebnis wird aus dem [[Körper]] der Methode mittels eines  return-Befehls (return) zurückgegeben. Möglich sind [[Primitive Datentypen|primitive Datentypen]] wie Integer, Double oder Boolean aber auch [[Komplexe Datentypen|komplexe Datentypen]]. Komplexe Datentypen könne ein beliebige [[Klassen]] sein wie z.B. Mitarbeiter.&lt;br /&gt;
&lt;br /&gt;
Soll ein Methode kein Ergebnis liefern muss das Schlüsselwort &#039;&#039;void&#039;&#039; geschrieben werden. &lt;br /&gt;
&lt;br /&gt;
===== Eingabeparameter =====&lt;br /&gt;
&lt;br /&gt;
Um eine Methode flexibel und wieder verwendbar zu gestalten, können von außen Werte an Variablen übergeben werden. Diese Variablen nennt man [[Eingabeparameter]]. Möglich sind 0 bis N Variablen. Jede Variable muss [[Deklaration|deklariert]] werden; benötigt also einen [[Datentyp]] und einen Namen. Die einzelnen  Variablen werden durch Kommas getrennt. Die gesamte Eingabeparameterliste wird in runde Klammern geschrieben (), egal ob sie null oder n Parameter enthält. Wie beim Rückgabeparameter können primitive und komplexe Datentypen vergeben werden.&lt;br /&gt;
&lt;br /&gt;
=== Körper ===&lt;br /&gt;
Der Körper einer Methode folgt auf den Kopf und wird in geschweiften Klammern geschrieben {}. Im Körper - also innerhalb der geschweiften Klammern - kann ein beliebiger [[Algorithmus]] stehen. Wurde im Kopf ein Rückgabeparameter definiert (also nicht &#039;&#039;void&#039;&#039;), dann muss in jedem Fall ein zum Datentyp des Rückgabeparameters  kompatible Rückgabe erfolgen. Die Rückgabe wird im Körper durch das Schlüsselwort &#039;&#039;return&#039;&#039; kenntlich gemacht.&lt;br /&gt;
&lt;br /&gt;
Der [[Algorithmus]] einer Methoden wird durch [[Kontrollstruktur|Kontrollstrukturen]], Ausdrücke und Operanden definiert.&lt;br /&gt;
&lt;br /&gt;
== Arten ==&lt;br /&gt;
Methoden, die nur einen Wert einer Instanzvariablen setzen bezeichnet man auch als verändernde Methoden (englisch auch setter-Methode).&lt;br /&gt;
&lt;br /&gt;
Methoden, die nur einen Wert einer Instanzvariablen zurückliefern, bezeichnet man auch als sondierende Methoden (englisch auch getter-Methode).&lt;br /&gt;
&lt;br /&gt;
Neben diesen beiden Kategorien gibt es beliebige Methoden und komplexen Algorithmen. &lt;br /&gt;
&lt;br /&gt;
=== Verändernde Methode ===&lt;br /&gt;
Verändernde Methoden werden auch &#039;&#039;&#039;setter-Methoden&#039;&#039;&#039; genannt. Ihre Aufgabe ist es, einen Wert einer [[Instanzvariable]] zu setzen. Im Rahmen der [[Deklaration]] von Instanzvariablen, haben sich gewisse Standards etabliert. Die [[Sichtbarkeit]] von Instanzvariablen sollte als &amp;quot;private&amp;quot; gewählt werden. So wird sichergestellt, dass Daten nicht ungefiltert in die Instanzvariable hineingeschrieben und gelesen werden können.&lt;br /&gt;
&lt;br /&gt;
So kann es sinnvoll sein, dass Rechnungsbeträge nur durch positive Gleitkommazahlen abgebildet werden sollen. Wählt man den [[Datentyp]] double, ist das Speichern von negativen Werten nach wie vor möglich.  Eine valide Postleitzahl wiederum besteht stets aus fünf Ziffern. Das Passwort eines Mitarbeiters soll mindestens aus sechs Zeichen bestehen und mindestens eine Ziffer beinhalten. Diese Auswahl an Beispielen zeigt, dass ein Mechanismus benötigt wird, der sicherstellt, dass die Wertzuweisung von Instanzvariablen einer Qualitätskontrolle unterzogen wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel einfache verändernde Methode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kann jeder Wert in z.B. eine Instanzvariable geschrieben werden reicht folgende setter-Methode aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
public void setName(String einName){&lt;br /&gt;
&lt;br /&gt;
        name = einName;&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Methode ist öffentlich zugänglich (&#039;&#039;public&#039;&#039;). Sie liefert kein Ergebnis (&#039;&#039;void&#039;&#039;). Daher darf auch im Körper der Methode kein return-Befehl stehen. Der Name der Methode lautet &#039;&#039;setName&#039;&#039;. Set steht für setzen und ist ein Verb. Die Eingabeparameter stehen in runden Klammern(). Hier gibt es eine Eingabe. Der [[Datentyp]] ist String und der Name des Eingabeparameters lautet einName. Der Wert von einName wird an die Instanzvariable name übergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel verändernde Methode mit Filter&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Rechnungsbeträge sollen nur positive Werte speichern dürfen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
public void setRechnungsbetrag (double einRechnungsbetrag){&lt;br /&gt;
&lt;br /&gt;
    if (einRechnungsbetrag&amp;gt;=0){   &lt;br /&gt;
&lt;br /&gt;
        rechnungsbetrag = einRechnungsbetrag;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sondierende Methode ===&lt;br /&gt;
Private Attribute verhindern den Zugriff von außen. Das Auslesen von Werten wird durch sondierende Methoden ermöglicht. Die folgende Methode String getName() ist eine sondierende Methode für die Instanzvariable Name.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
public String getName(){&lt;br /&gt;
    return name;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Methode ist öffentlich zugänglich (public). Sie liefert ein Ergebnis vom Typ String. Daher muss auch im Körper der Methode ein return-Befehl stehen. Der Name der Methode lautet &amp;quot;getName&amp;quot;. Get steht für gib und ist ein Verb. Die Eingabeparameter stehen in runden Klammern(). Hier gibt es keine Eingabeparameter, da nur der Werte der Instanzvariablen name zurückgegebenwerden soll.&lt;br /&gt;
&lt;br /&gt;
=== Komplexere Methode ===&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
private Mitarbeiter findeMitarbeiter(String nachname, String vorname){&lt;br /&gt;
&lt;br /&gt;
    for(Mitarbeiter aktuellerMitarbeiter:mitarbeiterListe){&lt;br /&gt;
&lt;br /&gt;
        if(aktuellerMitarbeiter.equals(nachname)){&lt;br /&gt;
&lt;br /&gt;
            return aktuellerMitarbeiter;&lt;br /&gt;
&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return null;&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Methode ist nicht öffentlich zugänglich (&#039;&#039;private&#039;&#039;). Die Methode heißt &#039;&#039;findeMitarbeiter&#039;&#039;. Sie liefert ein Ergebnis vom Typ Mitarbeiter. Mitarbeiter ist ein [[Klasse]]. Somit wird ein [[Objekt]] zurückgeben. Weil eine Rückgabe erwartet wird, muss im Körper der Methode ein return-Befehl stehen. Da in jedem Falle ein Rückgabe erfolgen muss, wird der return Befehl am Ende der Methode ausgeführt, für den Fall, dass kein Mitarbeiter gefunden wurde. Der Algorithmus der Mitarbeitersuche wurde durch die [[Kontrollstruktur|Kontrollstrukturen]] Verzweigung und Schleife realisiert. Die Eingabeparameter stehen in runden Klammern(). Hier gibt es zwei Eingabeparameter vom Typ String. Der erste heißt nachname, der zweite vorname.&lt;br /&gt;
&lt;br /&gt;
== Überladen ==&lt;br /&gt;
Das Überladen von Methoden ist sinnvoll, wenn Methoden eine vergleichbare Funktionalität haben und daher auch den gleichen Namen tragen sollten. Zwei Methoden einer Klasse heißen überladen, wenn sie den gleichen Namen, aber eine unterschiedliche Eingabeparameterliste haben. Ein abweichender Rückgabeparameter der Methoden ist für das Überladen nicht relevant. &lt;br /&gt;
&lt;br /&gt;
Eine unterschiedliche Parameterliste bedeutet, dass die Anzahl und/oder die Typen der Parameter unterschiedlich sind. Es spielt keine Rolle, ob die Methoden in der Klasse deklariert sind oder ob sie von einer anderen Klasse geerbt wurden.&lt;br /&gt;
&lt;br /&gt;
Beim Methodenaufruf wird die speziellste passende Methode ausgeführt. D.h. es wird automatisch die Methode ausgewählt, für die am wenigsten Parameter implizit in andere Datentypen konvertiert werden müssen. Diese Auswahl muss eindeutig sein.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Methoden ermitteln das Minimum einer Eingabeparameterliste. Methode 3 wird einen Compilerfehler auslösen, da sich die [[Methodensignatur|Signatur]] nur durch den Rückgabeparameter unterscheidet. Dies ist nicht ausreichend, um einer Methode zu überladen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
public class Berchnung&lt;br /&gt;
&lt;br /&gt;
{ &lt;br /&gt;
&lt;br /&gt;
//Methode 1&lt;br /&gt;
&lt;br /&gt;
public int min (int i1, int i2) { &lt;br /&gt;
&lt;br /&gt;
if (i1&amp;lt;i2){&lt;br /&gt;
&lt;br /&gt;
return i1;&lt;br /&gt;
&lt;br /&gt;
}else{&lt;br /&gt;
&lt;br /&gt;
return i2;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
//Methode 2&lt;br /&gt;
&lt;br /&gt;
public double min (double i1, double i2) { &lt;br /&gt;
&lt;br /&gt;
if (i1&amp;lt;i2){&lt;br /&gt;
&lt;br /&gt;
return i1;&lt;br /&gt;
&lt;br /&gt;
}else{&lt;br /&gt;
&lt;br /&gt;
return i2;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
//Methode 3&lt;br /&gt;
&lt;br /&gt;
public float min (double i1, double i2) { &lt;br /&gt;
&lt;br /&gt;
if (i1&amp;lt;i2){&lt;br /&gt;
&lt;br /&gt;
return i1;&lt;br /&gt;
&lt;br /&gt;
}else{&lt;br /&gt;
&lt;br /&gt;
return i2;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Polymorphie ==&lt;br /&gt;
[[Polymorphie]] bedeutet &amp;quot;Vielgestaltigkeit.&amp;quot; Im Bereich der [[Objektorientierung]] bezieht sich Polymorphie darauf, dass verschiedene [[Objekt|Objekte]] bei Aufruf derselben Methode unterschiedliches Verhalten an den Tag legen können.&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=Methodensignatur&amp;diff=3005</id>
		<title>Methodensignatur</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Methodensignatur&amp;diff=3005"/>
		<updated>2026-10-05T08:45:51Z</updated>

		<summary type="html">&lt;p&gt;Thomas: /* Aufbau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
In der [[Java]]-Programmierung spielt die Methodensignatur eine wichtige Rolle. Sie ist vergleichbar mit dem Steckbrief einer [[Methode]] und enthält alle wichtigen Informationen, die der [[Compiler]] benötigt, um sie eindeutig zu identifizieren.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
Die Methodensignatur in [[Java]] besteht aus zwei Elementen:&lt;br /&gt;
* Methodenname: Der Name, den die [[Methode]] trägt (z. B. berechneSumme).&lt;br /&gt;
* Eingabeparameterliste: Eine Liste der [[Datentyp|Datentypen]] der Parameter, die die [[Methode]] akzeptiert, in der korrekten Reihenfolge.#.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Wichtig ist, dass der Rückgabetyp der [[Methode]] und der [[Sichtbarkeit|Zugriffsmodifikator]] (z.B. public, private) nicht Teil der Signatur sind. Die Signatur dient ausschließlich dazu, die Methode innerhalb einer [[Klasse]] zu identifizieren und von anderen Methoden zu unterscheiden.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
public class Rechner {&lt;br /&gt;
    &lt;br /&gt;
    // Erste Methode&lt;br /&gt;
    public int addiere(int zahl1, int zahl2) {&lt;br /&gt;
        return zahl1 + zahl2;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Zweite Methode - hat eine andere Signatur!&lt;br /&gt;
    public double addiere(double zahl1, double zahl2) {&lt;br /&gt;
        return zahl1 + zahl2;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Dritte Methode - hat eine andere Signatur!&lt;br /&gt;
    public int subtrahiere(int zahl1, int zahl2) {&lt;br /&gt;
        return zahl1 - zahl2;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Signaturen der Methoden in diesem Beispiel sind:&lt;br /&gt;
&lt;br /&gt;
* addiere(int, int)&lt;br /&gt;
* addiere(double, double)&lt;br /&gt;
* subtrahiere(int, int)&lt;br /&gt;
&lt;br /&gt;
Die beiden addiere-[[Methode|Methoden]] haben den gleichen Namen, aber unterschiedliche Parameterlisten (einmal int, einmal double). Der [[Compiler]] kann sie dank ihrer unterschiedlichen Signaturen auseinanderhalten. Dieses Konzept wird als Methodenüberladen (Method Overloading) bezeichnet.&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=Methodensignatur&amp;diff=3004</id>
		<title>Methodensignatur</title>
		<link rel="alternate" type="text/html" href="https://wiki.flbk-hamm.de/index.php?title=Methodensignatur&amp;diff=3004"/>
		<updated>2026-10-05T08:44:04Z</updated>

		<summary type="html">&lt;p&gt;Thomas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
In der [[Java]]-Programmierung spielt die Methodensignatur eine wichtige Rolle. Sie ist vergleichbar mit dem Steckbrief einer [[Methode]] und enthält alle wichtigen Informationen, die der [[Compiler]] benötigt, um sie eindeutig zu identifizieren.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
Die Methodensignatur in [[Java]] besteht aus drei Elementen:&lt;br /&gt;
* Methodenname: Der Name, den die [[Methode]] trägt (z. B. berechneSumme).&lt;br /&gt;
* Eingabeparameterliste: Eine Liste der [[Datentyp|Datentypen]] der Parameter, die die [[Methode]] akzeptiert, in der korrekten Reihenfolge.#&lt;br /&gt;
* Rückgabeparamter: Ein [[Datentyp]] für die Rückgabe oder void für keine Rückgabe.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass der Rückgabetyp der [[Methode]] und der [[Sichtbarkeit|Zugriffsmodifikator]] (z.B. public, private) nicht Teil der Signatur sind. Die Signatur dient ausschließlich dazu, die Methode innerhalb einer [[Klasse]] zu identifizieren und von anderen Methoden zu unterscheiden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
public class Rechner {&lt;br /&gt;
    &lt;br /&gt;
    // Erste Methode&lt;br /&gt;
    public int addiere(int zahl1, int zahl2) {&lt;br /&gt;
        return zahl1 + zahl2;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Zweite Methode - hat eine andere Signatur!&lt;br /&gt;
    public double addiere(double zahl1, double zahl2) {&lt;br /&gt;
        return zahl1 + zahl2;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Dritte Methode - hat eine andere Signatur!&lt;br /&gt;
    public int subtrahiere(int zahl1, int zahl2) {&lt;br /&gt;
        return zahl1 - zahl2;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Signaturen der Methoden in diesem Beispiel sind:&lt;br /&gt;
&lt;br /&gt;
* addiere(int, int)&lt;br /&gt;
* addiere(double, double)&lt;br /&gt;
* subtrahiere(int, int)&lt;br /&gt;
&lt;br /&gt;
Die beiden addiere-[[Methode|Methoden]] haben den gleichen Namen, aber unterschiedliche Parameterlisten (einmal int, einmal double). Der [[Compiler]] kann sie dank ihrer unterschiedlichen Signaturen auseinanderhalten. Dieses Konzept wird als Methodenüberladen (Method Overloading) bezeichnet.&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=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>
</feed>