Sortieralgorithmus
Sortieralgorithmus Insertion Sort: C++ Implementierung Sortieralgorithmus Insertion Sort: C++ Implementierung
Sortieralgorithmen sortieren Zahlen oder Buchstaben nach deren natürlichen Reihenfolge bzw. dem Alphabet. Die Effizienz eines solchen Algorithmus kann bei hohen Datenbeständen  entscheidende Auswirkungen auf die einzusetzenden Ressourcen haben. Viele Unternehmen oder Organisationen arbeiten mit grossen Datenbeständen und benötigen zu deren Organisation effiziente Algorithmen.  Auch ganze Zeichenketten können sortiert werden, wenn man vorher eine lexikographische Ordnung vorgibt, wie z. B. bei dem ASCII-Zeichensatz.  Die Komplexität des Algorithmus wird mit dem Landau Symbol angegeben. Ein Algorithmus hat dann beispielsweise bei n zu sortierenden Elementen eine Laufzeit mit dem konstanten Grenzwert von Θ (für Theta) n * Log (n).  Das Landau Symbol Theta (Θ) bedeutet hier eine konstant gleich wachsende Funktion, also linear wachsend. Θ n* Log (n) ist dann ein effizienter Algorithmus: man bezeichent ihn als super-linear.  Die Laufzeit und der Ressourcenverbrauch des Suchalgorithmus, also die Effizienz, hängen auch vom Ausgangszustand der zu sortierenden Zeichenkette ab. Man unterscheidet zwischen Best Case, Average Case und Worst Case, wobei der  Worst Case ein strenger Maßstab für den Algorithmus ist.

Arten von Sortierverfahren 
Weitere Unterscheidungskriterien für Sortieralgorithmen sind, ob sie unabhängig von der Anzahl der Elemente in der Zeichenkette einen bestimmten Speicherraum allozieren (in-place oder in situ)  oder ob das nicht der Fall ist (out-of-place, ex situ). Stabile Sortieralgorithmen liefern als Ergebnis ganz sicher eine Zeichenkette in der vorgesehenen Reihenfolge, instabile können dies nicht garantieren.  Manche Sortierverfahren arbeiten bei vorsortierten Daten besser (adaptiv), bei manchen ist dies unabhängig vom Grad der Unordnung in der Zeichenkette (nicht adaptiv).

Einzelne Sortierverfahren 

1. Bubblesort:
Bubblesort ist ein stabiler, nicht rekursiver Algorithmus, der im Worst Case eine Komplexität von Θ (n ²) bzw. Θ (n ²)/2 hat. Bubblesort ist in-place und vergleicht immer zwei Nachbarn um sie im Falle einer  falschen Reihenfolge zu vertauschen. Dazu sind meistens mehrere Durchläufe notwendig, wobei die grösseren bzw. kleineren Zahlen wie Bubbles (Blasen im Wasser) nach oben steigen. Man bezeichnet auch ein Zahlenpaar, welches zu vertauschen  ist, als 'Bubble'.

2. Insertion Sort:
Insertion Sort ist ein stabiles, nicht rekursives Sortierverfahren, arbeitet in-place. Die Komplexität im Worst Case beträgt ebenso wie bei Bubble Sort Θ (n ²) bzw. Θ (n ²)/2. Insertion Sort  ist ein einfacher, wenig effizienter Sortieralgorithmus der jedoch gute Ergebnisse bei vorsortierten Zeichenketten oder bei wenig Elementen aufzuweisen hat, und leicht zu implementieren ist. Das eigentliche Finden der korrekten Einfügeposition  kann durch eine binäre Suche relativ effizient erfolgen, während die Verschiebe-Operationen auf dem Array, auf dem der Algorithmus oft arbeiten muss, weniger effizient sind. Man kann Insertion Sort vom Sortierprinzip  mit einem Stapel Karten vergleichen, die nacheinander aufgedeckt werden und entsprechend auf der Hand eingeordnet werden. Die Einfügeposition wird ermittelt, indem die einzufügende Karte nacheinander mit den auf der Hand  befindlichen Karten verglichen wird.

3. Heapsort
Heapsort ist ein nicht stabiles, nicht rekursives aber effizientes Sortierverfahren. Die Komplexität von Heapsort beträgt im Worst Case Θ (n * (log (n)). Heapsort ist eine Weiterentwicklung von  Selection Sort und arbeitet in-place. Die Daten müssen für Heap Sort in einem binären Heap vorliegen oder vorher in einen solchen überführt werden. Ein binärer Heap ist eine Datenstruktur, die man  wie eine Prioritätswarteschlange (priority queue) einsetzen kann. In einem binären Heap kann man Elemente in beliebiger Reihenfolge effizient und mit festgelegter Priorität in den Heap hineinlegen und stets das Element mit höchster Priorität entnehmen.  Die Priorität wird durch Schlüssel aufgeprägt. Bei einem Min-Heap bildet der kleinste Schlüssel die Wurzel des Baumes und alle Nachfolger sind grösser, bei einem Max-Heap ist es genau umgekehrt. Bei einem Array  ist für die zweite Hälfte des Array die Heap-Eigenschaft immer erfüllt, denn jeder Knoten in der zweiten Hälfte des Arrays entspricht im Heap einem Blatt und hat folglich keinen Nachfolgeknoten, dessen Wert grösser  sein kann als der eigene Wert. Um ein Array in einen Heap zu überführen werden alle vor der Array-Mitte liegenden Knoten nacheinander versickert, d.h. dass ein Knoten mit dem grösseren seiner nachfolgenden Knoten  vertauscht wird, falls dieser Grösser als er selber ist, bis es keinen Nachfolgeknoten mehr gibt, der grösser ist, und das Ganze wird solange fortgesetzt, bis das erste Element versickert wurde. Bei einem Max Heap nutzt der Sortieralgorithmus den Aufbau  des Max-Heap, bei dem der erste Knoten stets grösser ist als alle Nachfolgenden, also die Wurzel der grösste Knoten ist. Man vertauscht also den ersten Knoten (die Wurzel) mit dem letzten Element des Heap, so dass dann der grösste Wert  wunschgemäss hinten steht. Dann wird der Rest des Heap wieder in einen Max-Heap überführt, indem das erste Element versickert wird. Dann wird wieder die neue Wurzel getauscht, und zwar mit dem vorletzten Element usw.

4. Mergesort
Mergesort ist ein  stabiler, rekursiver Sortieralgorithmus. Komplexität ist im Worst Case Θ (n * (log (n)), bei Arrays auch Θ (n). Mergesort verwendet das Prinzip 'Teile und Herrsche' (Divide et Impera). Mergesort ist out-of-place. Das Sortierprinzip  von Mergesort geht folgendermaßen vor: eine zu sortierende Liste wird in kleinere Teil-Listen aufgeteilt, die jede für sich sortiert wird. Danach werden die Listen wieder zusammengeführt (to merge). Für Mergesort geeignet sind verkettete Listen,  so dass sich eine in-place Sortierung ergeben kann.

5. Quicksort:
Quicksort ist nicht stabil, rekursiv und in-place. Komplexität im Worst Case: Θ (n ²), im Average Case: Θ (n * (log (n)). Quicksort arbeitet wie Mergesort nach dem Teile  und Herrsche Prinzip: die Ausgangsliste wird in 2 Teil-Listen aufgeteilt. Dafür wird ein Pivotelement aus der Liste gewählt. Alle Elemente die kleiner sind als das Pivotelement kommen in die linke Teil-Liste, alle die grösser sind in die Rechte. Danach  werden die Teillisten in sich sortiert, mit demselben Verfahren, d.h. durch Aufruf von Quicksort. Quicksort ist deswegen auch rekursiv, weil es sich immer wieder selber aufruft.
Siehe auch:    Pseudocode   Programmiersprache-C   C-Plus-Plus   Java   Perl   LISP   algorithmus