Elementare Sortierverfahren

Ähnliche Dokumente
UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 9. Sortieren

Algorithmen und Datenstrukturen 1

Interne Sortierverfahren

Kap. 3: Sortieren. Überblick. Unser Sortierproblem. Motivation. Laufzeitmessung. Warum soll ich hier bleiben? Sortierverfahren sind WICHTIG!!!

7. Sortieren Lernziele. 7. Sortieren

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Einfache Sortierverfahren Autor: Stefan Edelkamp

Grundlegende Sortieralgorithmen

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (25 Sortieren vorsortierter Daten)

Algorithmen und Datenstrukturen. Kapitel 3: Sortierverfahren. Skript zur Vorlesung. Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen SS09. Foliensatz 15. Michael Brinkmeier. Technische Universität Ilmenau Institut für Theoretische Informatik

Datenstrukturen und Algorithmen

Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen

JAVA - Suchen - Sortieren

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

Tutoraufgabe 1 (Sortieralgorithmus):

Sortieralgorithmen. Selection Sort

Algorithmen und Datenstrukturen

Prof. Dr. Margarita Esponda

Algorithmen und Datenstrukturen

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Suchen und Sortieren

Teil III: Evaluationstest

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

Kapitel 6 Elementare Sortieralgorithmen

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Suchverfahren Autor: Stefan Edelkamp / Sven Schuierer

Algorithmen und Datenstrukturen 1-3. Seminar -

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

Grundlagen: Algorithmen und Datenstrukturen

Sortieralgorithmen. Direkte Sortierverfahren & Shellsort, Quicksort, Heapsort. Vorlesung Algorithmen und Datenstrukturen 2 im SS 2004

Sortieren durch Einfügen

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

Quicksort ist ein Divide-and-Conquer-Verfahren.

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Thema der Unterrichtseinheit: Sortieralgorithmus Bubblesort (Sortieren durch Vertauschen)

3. Übungsblatt zu Algorithmen I im SoSe 2017

8. Sortieren II. 8.1 Heapsort. Heapsort. [Max-]Heap 6. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Algorithmen und Datenstrukturen 1

Sortieren durch Einfügen. Prof. Dr. W. Kowalk Sortieren durch Einfügen 1

Algorithmen und Datenstrukturen

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

Programmieren in C. Strukturen und Zeiger. Prof. Dr. Nikolaus Wulff

2.2 Allgemeine (vergleichsbasierte) Sortierverfahren

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Programmierung mit C Algorithmen

Suchen und Sortieren Sortieren. Heaps

BUBBLE SORT. Können wir die gefundenen Algorithmen auch auf Listen mit mehr als drei Elementen ausdehnen?

Aufgabe (Schreibtischtest, Algorithmenanalyse)

Übung Datenstrukturen. Sortieren

Übung Algorithmen I

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Kap 7. Funktionen und Arrays

Randomisierte Algorithmen 2. Erste Beispiele

Die Formel für die Standardabweichung lautet (ohne die Wurzel haben wir die Varianz):

Aufgabe 8. 1 Arbeitsweise illustrieren. 2 Korrektheitsbeweis führen. 3 Laufzeitanalyse durchführen.

4. Sortieren 4.1 Vorbemerkungen

Grundlagen: Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen 2. Klausur SS 2001

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

Grundlagen der Programmierung

Humboldt-Universität zu Berlin Berlin, den Institut für Informatik

NAME, VORNAME: Studiennummer: Matrikel:

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

Aufgabenblatt: Arrays

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Spezielle Sortierverfahren Autor: Sven Schuierer

Effiziente Algorithmen 2

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 25

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

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

String - Matching. Kapitel Definition

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

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

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

Algorithmen und Datenstrukturen

13. Binäre Suchbäume

7. Parallele Algorithmen für FPGA-Implementierungen

Definition Ein Heap (priority queue) ist eine abstrakte Datenstruktur mit folgenden Kennzeichen:

Teil 1: Suchen. Ausgeglichene Bäume B-Bäume Digitale Suchbäume. M.O.Franz, Oktober 2007 Algorithmen und Datenstrukturen - Binärbäume 1-1

Klausur Algorithmen und Datenstrukturen SS August Arbeitszeit 90 min

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS

Algorithmen I. Tutorium 1-3. Sitzung. Dennis Felsing

Vom Leichtesten zum Schwersten Sortieralgorithmen

Transkript:

Algorithmen und Datenstrukturen I Elementare Sortierverfahren Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 18.03.2018 18:16 Inhaltsverzeichnis Sortieren....................................... 2 Das Sortierproblem................................. 2 Elementare Sortierverfahren............................ 2 Sortieren durch Auswahl 3....................................... 3......................................... 3....................................... 3 Satz......................................... 4 Sortieren durch Einfügen 4....................................... 4......................................... 4....................................... 4 Mittlerer Aufwand................................. 5 Shellsort 5....................................... 5......................................... 5....................................... 6 Bubblesort 6....................................... 6......................................... 6 1

....................................... 7 Sortieren Untersuchungen zeigen seit Jahren, dass mehr als ein Viertel der kommerziell verbrauchten Rechenzeit sortiert wird wir haben eine Menge von Datensätzen jeder Satz hat einen Schlüssel zwischen Schlüsseln ist eine Ordnungsrelation < oder definiert außer dem Schlüssel können Datensätze weitere Komponenten enthalten wenn nicht anders festgelegt, sind Schlüssel ganzzahlig Das Sortierproblem gegeben eine Folge von Sätzen s 1,..., s N jeder Satz s i hat einen Schlüssel k i gesucht wird eine Permutation π der Zahlen 1 bis N so dass die Umordnung der Sätze gemäß π die Schlüssel in aufsteigende Reihenfolge bringt k π(1) k π(2)... k π(n) Elementare Sortierverfahren gegeben N Datensätze in einem Feld (Array) a Ziel: a[1].key a[2].key... a[n].key zur Messung der Laufzeit: Anzahl Schlüsselvergleiche (comparsions) im besten und schlechtesten Fall und im Mittel: C min (N), C max (N) und C mit (N) Anzahl Bewegungen (movements) im besten und schlechtesten Fall und im Mittel: M min (N), M max (N) und M mit (N) Letzte Änderung: 18.03.2018 18:16 2

Sortieren durch Auswahl bestimme die Position j 1, an der das Element mit dem kleinsten Schlüssel unter a[1],..., a[n] auftritt und vertausche a[1] mit a[j 1 ] dann bestimme j 2, an der das Element mit dem kleinsten Schlüssel unter a[2],..., a[n] auftritt und vertausche a[2] mit a[j 2 ] bis alle Elemente an ihrem richtigen Platz stehen 1 void selectionsort(int *a, int n) { 2 for (int i = 0; i < n - 1; i++) { 3 int min = i; 4 for (int j = i + 1; j < n; j++) 5 if (a[j] < a[min]) 6 min = j; 7 int t = a[min]; 8 a[min] = a[i]; 9 a[i] = t; 10 } Schlüsselvergleiche in Zeile 5 Bewegungen in Zeilen 7-9 Anzahl der Schlüsselvergleiche unabhängig von der Ausgangsanordnung jeweils (N i), d.h. N 1 C min (N) = C max (N) = C mit (N) = (N i) Anzahl der Bewegungen = N 1 i = N(N 1) 2 = Θ(N 2 ) M min (N) = M max (N) = M mit (N) = 3(N 1) = Θ(N) Letzte Änderung: 18.03.2018 18:16 3

Satz Jeder Algorithmus zur Bestimmung des Minimums von N Schlüsseln, der allein auf Schlüsselvergleichen basiert, muss wenigstens N 1 Schlüsselvergleiche ausführen. Sortieren durch Einfügen die N zu sortierenden Elemente werden nacheinander betrachtet und in die bereits sortierte, anfangs leere Teilfolge an die richtige Stelle eingefügt 1 void insertionsort(int *a, int n) { 2 for (int i = 1; i < n; i++) { 3 int j = i; 4 int t = a[i]; 5 while (j && a[j - 1] > t) { 6 a[j] = a[j - 1]; 7 j--; 8 } 9 a[j] = t; 10 } Schlüsselvergleiche in Zeile 5 Bewegungen in Zeilen 4, 6 und 9 zum Einfügen des i-ten Elements mindestens 1 und höchstens i Schlüsselvergleiche, d.h. N C min (N) = N 1; C max (N) = i = Θ(N 2 ) zum Einfügen des i-ten Elements werden mindestens 2 und höchstens i + 1 Bewegungen ausgeführt, d.h. N M min (N) = 2(N 1); M max (N) = (i + 1) = Θ(N 2 ) i=2 i=2 Letzte Änderung: 18.03.2018 18:16 4

Mittlerer Aufwand im Mittel kann man erwarten, dass in jedem Schritt die Hälfte der Elemente im bereits sortierten Anfangsstück größer als das aktuell einzufügende Element ist damit ist Sortieren durch Einfügen von der Größenordnung N i 2 = Θ(N 2 ) Shellsort vorgeschlagen von Donald Lewis Shell Sortieren mit abnehmenden Inkrementen Elemente sollen in größeren Sprüngen schneller an ihre endgültige Position gebracht werden wir benötigen eine mit 1 endende Folge von abnehmenden Inkrementen h i, t i 1 dann werden der Folge der Inkremente nach die Teilfolgen aller Elemente, die h i Positionen voneinander entfernt sind, mittels Einfügesort sortiert die gesamte Folge heißt dann jeweils h i -sortiert 1 void shellsort(int *a, int n, vector<int> incs) { 2 for (auto h : incs) { 3 for (int i = h; i < n; i++) { 4 int j = i; 5 int t = a[i]; 6 bool continue_ = true; 7 while (a[j-h] > t && continue_) { 8 a[j] = a[j-h]; 9 j = j - h; 10 continue_ = j > h; 12 a[j] = t; 13 } 14 } 15 } Letzte Änderung: 18.03.2018 18:16 5

wichtigste Frage: Welche Folge abnehmender Inkremente soll verwendet werden um möglichst effizient zu sein? eine Reihe überraschender, aber insgesamt unvollständiger Erkenntnisse: man kann zeigen, dass die Laufzeit O(Nlog 2 N) ist, wenn man als Inkremente alle Zahlen der Form 2 p 3 q wählt, die kleiner als N sind Herstellen einer h-sortierten Folge aus einer bereits k-sortierten Folge zerstört die k-sortiertheit nicht Bubblesort als Bewegungen wird nur das Vertauschen zweier benachbarter Elemente zugelassen die Folge wird solange wiederholt durchlaufen, bis im letzten Durchlauf keine Vertauschungen mehr vorgenommen wurden größere Elemente haben die Tendenz, wie Luftblasen im Wasser, nach oben aufzusteigen daher der Name Bubblesort 1 void bubblesort(int *a, int n) { 2 bool swappedsomething; 3 do { 4 swappedsomething = false; 5 for (int i = 0; i < N - 1; i++) { 6 if (a[i] > a[i + 1]) { 7 int t = a[i]; 8 a[i] = a[i + 1]; 9 a[i + 1] = t; 10 swappedsomething = true; 12 } 13 } while (swappedsomething); 14 } Letzte Änderung: 18.03.2018 18:16 6

ist die Folge bereits sortiert, ergibt sich C min (N) = N 1; M min (N) = 0 ungünstigester Fall: Schlüssel in Folge absteigend sortiert N Durchläufe mit je N 1 Schlüsselvergleichen, d.h. C max (N) = N(N 1) = Θ(N 2 ) beim i-ten Durchlauf sind N i Vertauschungen, also 3(N i) Bewegungen, d.h. M max (N) = N 1 3(N i) = Θ(N 2 ) man kann auch zeigen: C mit (N) = M mit (N) = Θ(N 2 ) Letzte Änderung: 18.03.2018 18:16 7