Einführung in die Programmierung I. 6. Sortieren. Stefan Zimmer

Ähnliche Dokumente
Grundlagen der Programmierung 2. Sortierverfahren

Algorithmen und Datenstrukturen 1

Algorithmen und Datenstrukturen

Programmieren I. Kapitel 7. Sortieren und Suchen

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

Sortierverfahren für Felder (Listen)

Vom Leichtesten zum Schwersten Sortieralgorithmen

Universität des Saarlandes

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

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

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

Ausgewählte Algorithmen: Sortieren von Listen

Suchen. lineare Suche, binäre Suche, divide and conquer, rekursive und iterative Algorithmen, geordnete Daten, Comparable

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

1. Grundlagen Sortieren Vertauschen Selektion Einfügen Quicksort Suchen...

Einführung in die Informatik 2

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

Algorithmik Übung 3 Prof. Dr. Heiner Klocke. Sortierfolge nach Werten: Bube Dame König As nach Farben: Karo ( ) Herz ( ) Piek ( ) Kreuz ( )

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Ü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:

Abschnitt: Algorithmendesign und Laufzeitanalyse

Programmiertechnik II

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

12 (2-4)-Bäume Implementierbare Funktionen. (2-4)-Bäume sind durch folgende Eigenschaften deniert: 1. Alle Äste sind gleich lang

Grundlagen: Algorithmen und Datenstrukturen

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

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

Datenstrukturen und Algorithmen

JAVA - Suchen - Sortieren

Inhaltsverzeichnis. Einführende Bemerkungen 11. Das Fach Informatik 11 Zielsetzung der Vorlesung Grundbegriffe

Wie funktioniert das Sortieren einer Reihe von Zufallszahlen mit Quicksort?

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Laufzeit und Komplexität

Einführung in die Informatik I Kapitel II.3: Sortieren

Ein Algorithmus heißt rekursiv, wenn er sich selbst aufruft. Meist werden nur einzelne Module eines Gesamtalgorithmus rekursiv verwendet.

Grundlegende Sortieralgorithmen

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

Datenstrukturen und Algorithmen

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

Übungsaufgaben: 1. Objektorientierte Programmierung - Teil 1

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

Programmiertechnik II

Algorithmen. Sortieren durch Auswählen, Sortieren durch Mischen und Vergleich der Laufzeit. Abschätzung der Laufzeit eines Algorithmus, O-Notation.

Kapitel 6 Elementare Sortieralgorithmen

Einstieg in die Informatik mit Java

Kostenmaße. F3 03/04 p.188/395

Komplexität von Algorithmen

MAXIMUM2.STR Struktogramme. Aufgabe: 3 Zahlen eingeben, größte Zahl ermitteln und ausgeben.

2. Algorithmen und Algorithmisierung Algorithmen und Algorithmisierung von Aufgaben

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

11. Rekursion, Komplexität von Algorithmen

Algorithmen und Datenstrukturen

2. Felder (Arrays) 2.1 Suchen in Feldern. lineares Suchen: siehe Kapitel 1. Binäres Suchen. Vor.: Elemente (z.b. aufsteigend) sortiert

Grundlagen der Programmierung

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Babeș-Bolyai Universität Cluj Napoca Fakultät für Mathematik und Informatik Grundlagen der Programmierung MLG5005. Rekursion

Überblick. 1 Vorbemerkungen. 2 Algorithmen. 3 Eigenschaften von Algorithmen. 4 Historischer Überblick. Einführung

4 Effizienz und Komplexität 3.1 1

Datenstrukturen & Algorithmen

Informatik II Musterlösung

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

Effizienz von Algorithmen

Struktur am Beispiel einer Liste

Schulmethode zur Multiplikation von n-stelligen Binärzahlen a und b: (evtl. fallen Zeilen weg, wenn das zugehörige Bit des Multiplikators 0 ist).

Leitprogramm Bubblesort

Algorithmen und Datenstrukturen

damit hätten wir nach Ende der Schleife: "a[0 n-1] enthält nur Elemente aus a[0 n-1], aber in sortierter Reihenfolge".

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

Einstieg in die Informatik mit Java

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

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

ALP I. Funktionale Programmierung

Prof. H. Herbstreith Fachbereich Informatik. Leistungsnachweis. Informatik 1 WS 2001/2002

Flussdiagramm / Programmablaufplan (PAP)

Teile und Herrsche Teil 2

Algorithmen und Datenstrukturen 1

Sortieren. Ziel: Bringe Folge von Objekten in eine bestimmte Reihenfolge. Beispiel

WS 2009/10. Diskrete Strukturen

SUDOKU. l l l l l l l l l l l l l l l l. l l l l l l l l l l l l l l l l. l l l l l l l l l l l l l l l l

Logische Optimierung. Im Allgemeinen wird keine optimale Lösung erzielt, sondern nur eine Verbesserung. Logische Optimierung

4 Schleifen und Dateien

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

Hackenbusch und Spieltheorie

Tag der Mathematik 2016

Übersicht. Berechnung der Potenz für zwei ganze Zahlen Klausuraufgabe SS 2010! Berechnung der Cosinus-Funktion Klausuraufgabe WS 2010/2011!

Einführung in die Informatik 2

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

26 Hierarchisch strukturierte Daten

Inhaltsverzeichnis. 4.1 Systemmodell und notwendige Bedingungen. 4.2 Gegenmaßnahmen

Achtung: Groß O definiert keine totale Ordnungsrelation auf der Menge aller Funktionen! Beweis: Es gibt positive Funktionen f und g so, dass

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

Algorithmen und Datenstrukturen 1 VL Übungstest WS 2010/ November 2010

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Asymptotische Laufzeitanalyse: Beispiel

Folge 13 - Quicksort

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

Suchen und Sortieren (Die klassischen Algorithmen)

Vorlesung. Vollständige Induktion 1

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

Beginn der Vorlesung zur Numerik I (Wintersemester 2010/2011)

Transkript:

Einführung in die Programmierung I 6. Sortieren Stefan Zimmer 26.11.2007

2 Sortieren Gegeben seien n Dinge ai, 1 i n, und eine Vergleichsoperation (z.b. Zahlen und <, Strings und der lexikographische Vergleich in Maple auch < ) Wir sollen sie so umordnen, dass sie der Größe nach sortiert sind: i<j Þ a i a j. Das ist ein schönes Beispielproblem: nicht zu kompliziert, aber auch (wenn man es geschickt machen will) nicht trivial und es ist eine Aufgabe, vor der man immer mal wieder steht.

Sortieren durch Aussuchen Ein einfaches Verfahren: wir suchen in jedem Schritt aus dem unsortierten Haufen das kleinste Element aus, hängen es hinten an eine (anfangs leere) Liste an und entfernen es aus dem Haufen. Das kleinste Element in einem Haufen mit k Elementen zu finden, kostet uns k-1 Vergleiche. Der Gesamtaufwand für das Sortieren von n Elementen beträgt also (n-1) +... + 2 + 1 + 0 = n(n-1)/2 Vergleiche. 3

4 Sortieren durch Aussuchen (2) Der Aufwand n(n-1)/2 ist nicht gut: er wächst quadratisch in n um einen doppelt so großen Stapel zu sortieren, brauchen wir viermal soviel Zeit. Wir werden sehen, dass es auch Sortierverfahren gibt, bei denen der Aufwand wesentlich moderater mit n wächst.

5 Sortieren durch Mischen Auf der Suche nach einem besseren Verfahren erinnern wir uns an unser Motto: Teile und herrsche! Wir nehmen an, dass wir zwei Teillisten sortiert hätten dann ist es einfach, die beiden zu einer sortierten Liste zusammenzuführen. Später werden wir uns die sortierten Teillisten durch einen rekursive Verwendung dieses Verfahrens beschaffen, doch zunächst kümmern wir uns um das Zusammenführen.

l1 l2 Mischen: Listen zusammenführen 3 4 6 7 1 2 5 8 9 s 1 2 3 4 5 6 7 8 9 Da die Listen l1 und l2 sortiert sind, ist das kleinste noch verfügbare Element immer das kleinere der beiden Anfangselemente. Mit den Funktionen first, rest und append: ja first(l1)<first(l2)? s := append(s, first(l1)) l1 := rest(l1) nein s := append(s, first(l2)) l2 := rest(l2) Ausführen, solange noch Elemente da sind! Problem: was tun, wenn eine Liste leer wird? 6

7 Mischen: leere Liste Was tun wir, wenn (genau) eine der beiden Listen (hier: l2) leer ist? Dann hängen wir die andere hinten an s an. nicht leer l2 leer Hier ist noch mehr zu tun... s := append(s,l1) l1 := [ ]

8 Mischen: leere Liste (2) Natürlich kann auch l1 zuerst aufgebraucht sein: nicht leer l2 leer nicht leer Was hier fehlt, kennen wir schon! l1 s := append(s,l2) l2 := [ ] leer s := append(s,l1) l1 := [ ]

Mischen: alles zusammen Jetzt packen wir alle möglichen Fälle zusammen bauen noch die Schleife drumrum. Das Ganze läßt sich nun leicht in Maple übertragen s := [ ] Solange noch Elemente in l1 oder in l2 vorhanden nicht leer l2 leer nicht leer ja first(l1)<first(l2)? s := append(s, first(l1)) l1 := rest(l1) nein s := append(s, first(l2)) l2 := rest(l2) l1 s := append(s,l2) l2 := [ ] leer s := append(s,l1) l1 := [ ] 9

10 Mischen: Aufwand Was kostet es, die Listen l1mit n 1 Elementen und l2 mit n 2 Elementen zu mischen? Um ein Element an s anzufügen, brauchen wir höchstens: zwei Tests auf leere Liste Zugriff auf die beiden vordersten Elemente ein Vergleich zwischen diesen Elementen Ein Anfügen hinten an s, ein Entfernen aus l1/l2 Wir nehmen an, dass der Aufwand für jede dieser Operationen konstant ist (mit Maple-Listen ist das unrealistisch, bei vernünftiger Implementierung geht das schon) und zählen nur die Vergleiche: höchstens n 1 +n 2. (Streng genommen brauchen wir nur n 1 +n 2-1 Vergleiche)

11 Sortieren durch Mischen Wer mischen kann, kann auch sortieren: Die Liste in zwei gleich große Teile teilen (so gut wie möglich) Jeden der Teile sortieren (durch rekursiven Aufruf der Funktion) Die sortierten Teillisten mischen Hat die Liste nur ein Element, funktioniert das Teilen nicht glücklicherweise sind einelementige Listen automatisch sortiert! Dieses Verfahren nennt man Mergesort

Mergesort: Aufwand Wie teuer ist das Sortieren von n Elementen mittels Mergesort? Zur Vereinfachung nehmen wir an, dass n eine Zweierpotenz ist: n=2 k (dann geht das Teilen immer perfekt auf) Beginnen wir mit dem Schluss: Am Ende sind zwei Listen der Länge 2 k-1 zu mischen das sind höchstens 2 k Vergleiche Für jede dieser beiden Listen mussten zwei Listen der Länge 2 k-2 gemischt werden, insgesamt deren vier, zusammen höchstens 2 k Vergleiche 12

Mergesort: Aufwand (2) Zwischen je zwei Ebenen fallen höchstens 2 k Vergleiche an Es gibt k+1=log 2 n + 1 Ebenen, also insgesamt höchstens 2 k k= n log 2 n Vergleiche Das ist viel besser als n(n-1)/2 13

Mergesort: Bewertung Mergesort mit einem Aufwand proportional zu n logn ist ein schnelles Sortierverfahren man kann unter recht allgemeinen Annahmen zeigen, dass es besser nicht geht. Ein wichtiger Nachteil ist aber, dass ich auch bei geschickter Implementierung ein Hilfsfeld in gleicher Größe wie die Eingabe brauche, bei sehr großen Datensätzen würde man lieber auf dem Platz sortieren. 14