Algorithmen und Datenstrukturen

Ähnliche Dokumente
Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)).

Abschnitt: Algorithmendesign und Laufzeitanalyse

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Pro Informatik 2009: Objektorientierte Programmierung Tag 17. Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik

Kapitel 6 Elementare Sortieralgorithmen

Datenstrukturen und Algorithmen

Programmieren I. Kapitel 7. Sortieren und Suchen

Sortieralgorithmen. Jan Pöschko. 18. Januar Problemstellung Definition Warum Sortieren?... 2

Übungsblatt 1. f(n) = f(n) = O(g(n)) g(n) = O(f(n)) Zeigen oder widerlegen Sie: 3 n = Θ(2 n ) Aufgabe 1.2 Gegeben sei die folgende Funktion:

Algorithmen und Datenstrukturen Sortieren

2 Sortieren. Beispiel: Es seien n = 8 und a = i : a i : ϕ(i) : a ϕ(i) :

Algorithmen und Datenstrukturen

Suchen und Sortieren Sortieren. Heaps

JAVA - Suchen - Sortieren

Suchen und Sortieren (Die klassischen Algorithmen)

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

Algorithmen und Datenstrukturen Wintersemester 2004/ November T(n) = T(n a) + T(a) + n

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Algorithmen und Datenstrukturen 1

Grundlagen der Programmierung 2. Sortierverfahren

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Folge 13 - Quicksort

Programmiertechnik II

Effiziente Algorithmen und Datenstrukturen I. Kapitel 9: Minimale Spannbäume

Randomisierte Algorithmen 2. Erste Beispiele

Sortierverfahren für Felder (Listen)

2.3.1 Einleitung Einfache Sortierverfahren Höhere Sortierverfahren Komplexität von Sortierverfahren Spezielle Sortierverfahren

Datenstrukturen & Algorithmen

16. All Pairs Shortest Path (ASPS)

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Grundlegende Sortieralgorithmen

Sortieren Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 1

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

Klausur Datenstrukturen und Algorithmen SoSe 2012

Algorithmen und Datenstrukturen 1

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

Kap. 4.4: B-Bäume Kap. 4.5: Dictionaries in der Praxis

Datenstrukturen und Algorithmen

Algorithmentheorie Randomisierung. Robert Elsässer

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Algorithmen und Datenstrukturen Suchbaum

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Was bisher geschah ADT Menge mit Operationen: Suche nach einem Element Einfügen eines Elementes Löschen eines Elementes Realisierung durch

Informatik I 4. Kapitel Suchen in sequentiellen Listen

MATHEMATISCHE ANALYSE VON ALGORITHMEN

Programmiertechnik II

Informatik I 1. Kapitel. Einführung in Algorithmen und Datenstrukturen. Einführung in Algorithmen. Einführung in Algorithmen.

S=[n] Menge von Veranstaltungen J S kompatibel mit maximaler Größe J

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

Binäre Suchbäume. Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps

Datenstrukturen & Algorithmen

Kapitel 6. Komplexität von Algorithmen. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Algorithmen & Datenstrukturen 1. Klausur

Kapitel 9 Suchalgorithmen

Ausgewählte Algorithmen: Sortieren von Listen

Algorithmen II Vorlesung am

Algorithmen und Datenstrukturen 1-1. Seminar -

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

HINWEISE ZUR ADS-KLAUSUR SS06 für BACHELOR (für beide Termine)

Übersicht Datenstrukturen und Algorithmen. Literatur. Algorithmus: Wikipedia Definition. Vorlesung 1: Einführung. Prof. Dr.

3.2. Korrektheit und Komplexität am Beispiel: Sortieren Sortieren ist eine wichtige Basis-Operation für komplexe Algorithmen

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

Asymptotische Laufzeitanalyse: Beispiel

DATENSTRUKTUREN UND ALGORITHMEN

Algorithmen und Datenstrukturen Balancierte Suchbäume

Laufzeit und Komplexität

Einführung in die Informatik 2

Name:... Vorname:... Matrikel-Nr.:... Unterschrift:...

Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen

Vorname:... Matrikel-Nr.:... Unterschrift:...

Algorithmen und Datenstrukturen

Überblick. Lineares Suchen

Erinnerung VL

Fragen für die Klausuren

T (n) = max. g(x)=n t(n) S(n) = max. g(x)=n s(n)

Grundlagen der Programmierung

11.1 Grundlagen - Denitionen

Ideen der Informatik Suchen und Sortieren [Ordnung muss sein ] Kurt Mehlhorn Adrian Neumann viele Folien von Kostas Panagiotou

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / 2015 Vorlesung 3, Donnerstag 6.

4 Greedy-Algorithmen (gierige Algorithmen)

13. Binäre Suchbäume

Algorithmen und Datenstrukturen

Transkript:

Algorithmen und Datenstrukturen A7. Sortieren III Marcel Lüthi and Gabriele Röger Universität Basel 14. März 2018

Untere Schranke

Sortierverfahren Sortieren Vergleichsbasierte Verfahren Nicht vergleichsbasierte Verfahren Überblick und Ausblick Selectionsort Insertionsort Mergesort Minimale Vergleichszahl Quick Sort Heap Sort

Untere Schranke I Mergesort hatte bisher mit O(n log 2 n) die beste (Worstcase-)Laufzeit. Geht es noch besser? Wir zeigen: Nicht mit vergleichsbasierten Verfahren!

Untere Schranke II Betrachte beliebigen vergleichsbasierten Sortieralgorithmus A. Verhalten hängt nur vom Ergebnis der Schlüsselvergleiche ab. Bei jedem Schlüsselvergleich gibt es zwei Möglichkeiten, wie der Algorithmus weiter macht. Wir können das graphisch als Baum darstellen.

Untere Schranke III Binärbaum: jeder Knoten hat höchstens zwei Nachfolger Knoten ohne Nachfolger heissen Blätter (Bild: eckige Knoten). Der Knoten ganz oben ist die Wurzel. Die Tiefe eines Blattes entspricht der Anzahl von Kanten von der Wurzel zu dem Blatt. Die maximale Tiefe eines Blattes in einem Binärbaum mit k Blättern ist mindestens log 2 k.

Untere Schranke III Binärbaum: jeder Knoten hat höchstens zwei Nachfolger Knoten ohne Nachfolger heissen Blätter (Bild: eckige Knoten). Der Knoten ganz oben ist die Wurzel. Die Tiefe eines Blattes entspricht der Anzahl von Kanten von der Wurzel zu dem Blatt. Die maximale Tiefe eines Blattes in einem Binärbaum mit k Blättern ist mindestens log 2 k.

Untere Schranke IV Was muss der Algorithmus können? Annahme: alle Elemente unterschiedlich Muss alle Eingaben der Grösse n korrekt sortieren. Wir können alle Algorithmen so anpassen, dass sie verfolgen, von welcher Position zu welcher Position die Elemente bewegt werden müssen. Das Ergebnis ist dann nicht das sortierte Array, sondern die entsprechende Permutation. Beispiel: pos0 pos2, pos1 pos1, pos2 pos0 Da alle möglichen Eingaben der Grösse n korrekt gelösst werden müssen, muss der Algorithmus alle n! möglichen Permutationen erzeugen können.

Untere Schranke IV Was muss der Algorithmus können? Annahme: alle Elemente unterschiedlich Muss alle Eingaben der Grösse n korrekt sortieren. Wir können alle Algorithmen so anpassen, dass sie verfolgen, von welcher Position zu welcher Position die Elemente bewegt werden müssen. Das Ergebnis ist dann nicht das sortierte Array, sondern die entsprechende Permutation. Beispiel: pos0 pos2, pos1 pos1, pos2 pos0 Da alle möglichen Eingaben der Grösse n korrekt gelösst werden müssen, muss der Algorithmus alle n! möglichen Permutationen erzeugen können.

Untere Schranke IV Was muss der Algorithmus können? Annahme: alle Elemente unterschiedlich Muss alle Eingaben der Grösse n korrekt sortieren. Wir können alle Algorithmen so anpassen, dass sie verfolgen, von welcher Position zu welcher Position die Elemente bewegt werden müssen. Das Ergebnis ist dann nicht das sortierte Array, sondern die entsprechende Permutation. Beispiel: pos0 pos2, pos1 pos1, pos2 pos0 Da alle möglichen Eingaben der Grösse n korrekt gelösst werden müssen, muss der Algorithmus alle n! möglichen Permutationen erzeugen können.

Untere Schranke V Jedes Blatt in der Baumdarstellung entspricht einer Permutation. Bei Eingabegrösse n muss der Baum also mindestens n! Blätter haben. Die maximale Tiefe des entsprechenden Baumes ist demnach log 2 (n!). Es gibt also eine Eingabe der Grösse n mit log 2 (n!) Schlüsselvergleichen.

Untere Schranke VI Abschätzung von log 2 (n!) Es gilt n! (n/2) n/2 4! = 1 2 3 2 4 2 2 2 log 2 (n!) log 2 ((n/2) n/2 ) = n/2log 2 (n/2) log 2 (n!) = n/2(log 2 n log 2 2) = n/2(log 2 n 1) Theorem Jeder vergleichsbasierte Sortieralgorithmus benötigt Ω(n log n) viele Schlüsselvergleiche. Damit liegt auch die Laufzeit in Ω(n log n). Mergesort ist asymptotisch optimal.

Untere Schranke VI Abschätzung von log 2 (n!) Es gilt n! (n/2) n/2 4! = 1 2 3 2 4 2 2 2 log 2 (n!) log 2 ((n/2) n/2 ) = n/2log 2 (n/2) log 2 (n!) = n/2(log 2 n log 2 2) = n/2(log 2 n 1) Theorem Jeder vergleichsbasierte Sortieralgorithmus benötigt Ω(n log n) viele Schlüsselvergleiche. Damit liegt auch die Laufzeit in Ω(n log n). Mergesort ist asymptotisch optimal.

Untere Schranke VI Abschätzung von log 2 (n!) Es gilt n! (n/2) n/2 4! = 1 2 3 2 4 2 2 2 log 2 (n!) log 2 ((n/2) n/2 ) = n/2log 2 (n/2) log 2 (n!) = n/2(log 2 n log 2 2) = n/2(log 2 n 1) Theorem Jeder vergleichsbasierte Sortieralgorithmus benötigt Ω(n log n) viele Schlüsselvergleiche. Damit liegt auch die Laufzeit in Ω(n log n). Mergesort ist asymptotisch optimal.

Quicksort

Sortierverfahren Sortieren Vergleichsbasierte Verfahren Nicht vergleichsbasierte Verfahren Überblick und Ausblick Selectionsort Insertionsort Mergesort Minimale Vergleichszahl Quick Sort Heap Sort

Quicksort: Idee Wie Merge-Sort ein Divide-and-Conquer-Verfahren Die Sequenz wird nicht wie bei Mergesort nach Positionen aufgeteilt, sondern nach Werten. Hierfür wird ein Element P gewählt (das sogenannte Pivotelement). Dann wird so umsortiert, dass P an die endgültige Position kommt, vor P nur Elemente P stehen, und hinten nur Elemente P. P P P Macht man das rekursiv für den vorderen und den hinteren Teil, ist die Sequenz am Ende sortiert.

Quicksort: Algorithmus 1 def sort(array): 2 sort_aux(array, 0, len(array)-1) 3 4 def sort_aux(array, lo, hi): 5 if hi <= lo: 6 return 7 choose_pivot_and_swap_it_to_lo(array, lo, hi) 8 pivot_pos = partition(array, lo, hi) 9 sort_aux(array, lo, pivot_pos - 1) 10 sort_aux(array, pivot_pos + 1, hi)

Wie wählt man das Pivot-Element? Für die Korrektheit des Verfahrens ist das egal. (Warum?) Wir können zum Bsp. folgende Strategien wählen: Naiv: Nimm immer erstes Element Median of Three: Verwende Median aus erstem, mittlerem und letztem Element Randomisiert: Wähle zufällig ein Element aus Gute Pivot-Elemente teilen Sequenz in etwa gleich grosse Bereiche.

Wie macht man die Umsortierung? lo... 5 i... 5 7 array hi 7 4 2 3 6 4 2 3 6 j j... Pivot ist an Pos 0. Initialisiere i = lo + 1, j = hi... i nach rechts bis zu Element Pivot, i j nach links bis Element Pivot... 5 7 4 2 3 6... i j Falls i < j: Elemente tauschen, i++, j... 5 3 4 2 7 6... i nach rechts bis zu Element Pivot, j i j nach links bis Element Pivot... 5 3 4 2 7 6... i j: noch Pivot an Pos j tauschen j i 7... 2 3 4 5 6... Fertig!

Wie macht man die Umsortierung? lo... 5 i... 5 7 array hi 7 4 2 3 6 4 2 3 6 j j... Pivot ist an Pos 0. Initialisiere i = lo + 1, j = hi... i nach rechts bis zu Element Pivot, i j nach links bis Element Pivot... 5 7 4 2 3 6... i j Falls i < j: Elemente tauschen, i++, j... 5 3 4 2 7 6... i nach rechts bis zu Element Pivot, j i j nach links bis Element Pivot... 5 3 4 2 7 6... i j: noch Pivot an Pos j tauschen j i 7... 2 3 4 5 6... Fertig!

Wie macht man die Umsortierung? lo... 5 i... 5 7 array hi 7 4 2 3 6 4 2 3 6 j j... Pivot ist an Pos 0. Initialisiere i = lo + 1, j = hi... i nach rechts bis zu Element Pivot, i j nach links bis Element Pivot... 5 7 4 2 3 6... i j Falls i < j: Elemente tauschen, i++, j... 5 3 4 2 7 6... i nach rechts bis zu Element Pivot, j i j nach links bis Element Pivot... 5 3 4 2 7 6... i j: noch Pivot an Pos j tauschen j i 7... 2 3 4 5 6... Fertig!

Wie macht man die Umsortierung? lo... 5 i... 5 7 array hi 7 4 2 3 6 4 2 3 6 j j... Pivot ist an Pos 0. Initialisiere i = lo + 1, j = hi... i nach rechts bis zu Element Pivot, i j nach links bis Element Pivot... 5 7 4 2 3 6... i j Falls i < j: Elemente tauschen, i++, j... 5 3 4 2 7 6... i nach rechts bis zu Element Pivot, j i j nach links bis Element Pivot... 5 3 4 2 7 6... i j: noch Pivot an Pos j tauschen j i 7... 2 3 4 5 6... Fertig!

Wie macht man die Umsortierung? lo... 5 i... 5 7 array hi 7 4 2 3 6 4 2 3 6 j j... Pivot ist an Pos 0. Initialisiere i = lo + 1, j = hi... i nach rechts bis zu Element Pivot, i j nach links bis Element Pivot... 5 7 4 2 3 6... i j Falls i < j: Elemente tauschen, i++, j... 5 3 4 2 7 6... i nach rechts bis zu Element Pivot, j i j nach links bis Element Pivot... 5 3 4 2 7 6... i j: noch Pivot an Pos j tauschen j i 7... 2 3 4 5 6... Fertig!

Quicksort: Partitionierung 1 def partition(array, lo, hi): 2 pivot = array[lo] 3 i = lo + 1 4 j = hi 5 while (True): 6 while i < hi and array[i] < pivot: 7 i += 1 8 while array[j] > pivot: 9 j -= 1 10 if i >= j: 11 break 12 13 array[i], array[j] = array[j], array[i] 14 i, j = i + 1, j - 1 15 array[lo], array[j] = array[j], array[lo] 16 return j

Quicksort: Laufzeit I Best case: Pivot-Element teilt in gleich grosse Bereiche log 2 n rekursive Aufrufe jeweils hi-lo Schlüsselvergleiche in Partitionierung auf einer Rekursionsebene insgesamt O(n) Vergleiche in Partitionierung O(n log n)

Quicksort: Laufzeit I Best case: Pivot-Element teilt in gleich grosse Bereiche log 2 n rekursive Aufrufe jeweils hi-lo Schlüsselvergleiche in Partitionierung auf einer Rekursionsebene insgesamt O(n) Vergleiche in Partitionierung O(n log n) Worst case: Pivot-Element immer kleinstes oder grösstes Element insgesamt n-1 (nichttriviale) rekursive Aufrufe für Länge n, n 1,..., 2. jeweils hi-lo Schlüsselvergleiche in Partitionierung Θ(n 2 )

Quicksort: Laufzeit II Average case: Annahme: n verschiedene Elemente, jede der n! Permutationen gleich wahrscheinlich, Pivotelement zufällig gewählt O(log n) rekursive Aufrufe insgesamt O(n log n) etwa 39% langsamer als best case Bei randomisierter Pivotwahl tritt worst-case quasi nicht auf. Quicksort wird daher oft als O(n log n)-verfahren betrachtet.

Quicksort: Laufzeit II Average case: Annahme: n verschiedene Elemente, jede der n! Permutationen gleich wahrscheinlich, Pivotelement zufällig gewählt O(log n) rekursive Aufrufe insgesamt O(n log n) etwa 39% langsamer als best case Bei randomisierter Pivotwahl tritt worst-case quasi nicht auf. Quicksort wird daher oft als O(n log n)-verfahren betrachtet.

Heapsort

Sortierverfahren Sortieren Vergleichsbasierte Verfahren Nicht vergleichsbasierte Verfahren Überblick und Ausblick Selectionsort Insertionsort Mergesort Minimale Vergleichszahl Quick Sort Heap Sort

Heapsort Heap: Datenstruktur, die das Finden und Entnehmen des grössten Elements besonders effizient unterstützt Finden: Θ(1), Entnehmen: Θ(log n) Grundidee analog zu Selectionsort: Setze sukzessive das grösste Element an das Ende des unsortierten Bereichs. Kann den Heap direkt in der Eingabesequenz repräsentieren. Wir besprechen die Details später, wenn wir Heaps genauer kennengelernt haben.

Nicht vergleichsbasierte Verfahren

Sortierverfahren Vergleichsbasierte Verfahren Countingsort Sortieren Nicht vergleichsbasierte Verfahren Radixsort Überblick und Ausblick

Countingsort: Idee Sortieren durch Zählen Annahme: Elemente sind aus Bereich 0,..., k 1. Laufe einmal über die Eingabesequenz und zähle dabei, wie oft jedes Element vorkommt. Sei #i die Anzahl der Vorkommen von Element i. Iteriere i = 0,..., k 1 und schreibe jeweils #i-mal Element i in die Sequenz.

Countingsort: Algorithmus 1 def sort(array, k): 2 counts = [0] * k # list of k zeros 3 for elem in array: 4 counts[elem] += 1 5 6 pos = 0 7 for i in range(k): 8 occurrences_of_i = counts[i] 9 for j in range(occurrences_of_i): 10 array[pos + j] = i 11 pos += occurrences_of_i Laufzeit: O(n + k) (n Grösse der Eingabesequenz) Laufzeit: Für festes k linear

Countingsort: Algorithmus 1 def sort(array, k): 2 counts = [0] * k # list of k zeros 3 for elem in array: 4 counts[elem] += 1 5 6 pos = 0 7 for i in range(k): 8 occurrences_of_i = counts[i] 9 for j in range(occurrences_of_i): 10 array[pos + j] = i 11 pos += occurrences_of_i Laufzeit: O(n + k) (n Grösse der Eingabesequenz) Laufzeit: Für festes k linear

Countingsort: Algorithmus 1 def sort(array, k): 2 counts = [0] * k # list of k zeros 3 for elem in array: 4 counts[elem] += 1 5 6 pos = 0 7 for i in range(k): 8 occurrences_of_i = counts[i] 9 for j in range(occurrences_of_i): 10 array[pos + j] = i 11 pos += occurrences_of_i Laufzeit: O(n + k) (n Grösse der Eingabesequenz) Laufzeit: Für festes k linear

Sortierverfahren Vergleichsbasierte Verfahren Countingsort Sortieren Nicht vergleichsbasierte Verfahren Radixsort Überblick und Ausblick

Radixsort: Idee Sortieren durch Fachverteilen Annahme: Schlüssel sind Zahlen im Dezimalsystem z.b. 763, 983, 96, 286, 462 Teile Zahlen nach letzter Stelle auf: 0 1 2 3 4 5 6 7 8 9 462 763 983 96 286 Sammle Zahlen von vorne nach hinten/oben nach unten auf 462, 763, 983, 96, 286 Teile Zahlen nach vorletzter Stelle auf, sammle sie auf. Teile Zahlen nach drittletzter Stelle auf, sammle sie auf. usw. bis alle Stellen betrachtet wurden.

Radixsort: Idee Sortieren durch Fachverteilen Annahme: Schlüssel sind Zahlen im Dezimalsystem z.b. 763, 983, 96, 286, 462 Teile Zahlen nach letzter Stelle auf: 0 1 2 3 4 5 6 7 8 9 462 763 983 96 286 Sammle Zahlen von vorne nach hinten/oben nach unten auf 462, 763, 983, 96, 286 Teile Zahlen nach vorletzter Stelle auf, sammle sie auf. Teile Zahlen nach drittletzter Stelle auf, sammle sie auf. usw. bis alle Stellen betrachtet wurden.

Radixsort: Idee Sortieren durch Fachverteilen Annahme: Schlüssel sind Zahlen im Dezimalsystem z.b. 763, 983, 96, 286, 462 Teile Zahlen nach letzter Stelle auf: 0 1 2 3 4 5 6 7 8 9 462 763 983 96 286 Sammle Zahlen von vorne nach hinten/oben nach unten auf 462, 763, 983, 96, 286 Teile Zahlen nach vorletzter Stelle auf, sammle sie auf. Teile Zahlen nach drittletzter Stelle auf, sammle sie auf. usw. bis alle Stellen betrachtet wurden.

Radixsort: Idee Sortieren durch Fachverteilen Annahme: Schlüssel sind Zahlen im Dezimalsystem z.b. 763, 983, 96, 286, 462 Teile Zahlen nach letzter Stelle auf: 0 1 2 3 4 5 6 7 8 9 462 763 983 96 286 Sammle Zahlen von vorne nach hinten/oben nach unten auf 462, 763, 983, 96, 286 Teile Zahlen nach vorletzter Stelle auf, sammle sie auf. Teile Zahlen nach drittletzter Stelle auf, sammle sie auf. usw. bis alle Stellen betrachtet wurden.

Radixsort: Beispiel Eingabe: 763, 983, 96, 286, 462 Aufteilung nach letzter Stelle: 0 1 2 3 4 5 6 7 8 9 462 763 96 983 286 Aufsammeln ergibt: 462, 763, 983, 96, 286 Aufteilung nach vorletzter Stelle: 0 1 2 3 4 5 6 7 8 9 462 983 96 763 286 Aufsammeln ergibt: 462, 763, 983, 286, 96 Aufteilung nach drittletzter Stelle: 0 1 2 3 4 5 6 7 8 9 096 286 462 763 983 Aufsammeln ergibt: 96, 286, 462, 763, 983

Radixsort: Beispiel Eingabe: 763, 983, 96, 286, 462 Aufteilung nach letzter Stelle: 0 1 2 3 4 5 6 7 8 9 462 763 96 983 286 Aufsammeln ergibt: 462, 763, 983, 96, 286 Aufteilung nach vorletzter Stelle: 0 1 2 3 4 5 6 7 8 9 462 983 96 763 286 Aufsammeln ergibt: 462, 763, 983, 286, 96 Aufteilung nach drittletzter Stelle: 0 1 2 3 4 5 6 7 8 9 096 286 462 763 983 Aufsammeln ergibt: 96, 286, 462, 763, 983

Radixsort: Beispiel Eingabe: 763, 983, 96, 286, 462 Aufteilung nach letzter Stelle: 0 1 2 3 4 5 6 7 8 9 462 763 96 983 286 Aufsammeln ergibt: 462, 763, 983, 96, 286 Aufteilung nach vorletzter Stelle: 0 1 2 3 4 5 6 7 8 9 462 983 96 763 286 Aufsammeln ergibt: 462, 763, 983, 286, 96 Aufteilung nach drittletzter Stelle: 0 1 2 3 4 5 6 7 8 9 096 286 462 763 983 Aufsammeln ergibt: 96, 286, 462, 763, 983

Radixsort: Beispiel Eingabe: 763, 983, 96, 286, 462 Aufteilung nach letzter Stelle: 0 1 2 3 4 5 6 7 8 9 462 763 96 983 286 Aufsammeln ergibt: 462, 763, 983, 96, 286 Aufteilung nach vorletzter Stelle: 0 1 2 3 4 5 6 7 8 9 462 983 96 763 286 Aufsammeln ergibt: 462, 763, 983, 286, 96 Aufteilung nach drittletzter Stelle: 0 1 2 3 4 5 6 7 8 9 096 286 462 763 983 Aufsammeln ergibt: 96, 286, 462, 763, 983

Radixsort: Algorithmus (für beliebige Basis) 1 def sort(array, base=10): 2 if not array: # array is empty 3 return 4 iteration = 0 5 max_val = max(array) # identify largest element 6 while base ** iteration <= max_val: 7 buckets = [[] for num in range(base)] 8 for elem in array: 9 digit = (elem // (base ** iteration)) % base 10 buckets[digit].append(elem) 11 pos = 0 12 for bucket in buckets: 13 for elem in bucket: 14 array[pos] = elem 15 pos += 1 16 iteration += 1

Radixsort: Laufzeit m: Maximale Anzahl Stellen in Repräsentation mit gegebener Basis b. n: Länge der Eingabesequenz Laufzeit in O(m (n + b)) Für festes m und b hat Radixsort lineare Laufzeit.

Radixsort: Laufzeit m: Maximale Anzahl Stellen in Repräsentation mit gegebener Basis b. n: Länge der Eingabesequenz Laufzeit in O(m (n + b)) Für festes m und b hat Radixsort lineare Laufzeit.

Zusammenfassung

Zusammenfassung Jedes vergleichsbasierte Sortierverfahren hat mindestens leicht überlineare Laufzeit. Quicksort ist ein Divide-and-Conquer-Verfahren, das die Elemente relativ zu einem Pivotelement aufteilt. Countingsort und Radixsort sind nicht vergleichsbasiert und erlauben ein Sortieren in linearer Zeit. Sie machen jedoch zusätzliche Einschränkungen an die verwendeten Schlüssel.