(08 - Einfache Sortierverfahren)

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

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

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

Interne Sortierverfahren

Algorithmen und Datenstrukturen 1

Sortierverfahren 1. Bubble Sort Selection Sort Insertion Sort

Übung: Algorithmen und Datenstrukturen SS 2007

Algorithmen und Datenstrukturen 1

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

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

7. Sortieren Lernziele. 7. Sortieren

Prof. Dr. Margarita Esponda

Übung Algorithmen und Datenstrukturen

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

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

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Sortieralgorithmen. Selection Sort

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

Grundlegende Sortieralgorithmen

Tutoraufgabe 1 (Sortieralgorithmus):

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Programmieren I. Kapitel 7. Sortieren und Suchen

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

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

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

Untere Schranke für allgemeine Sortierverfahren

Suchen und Sortieren

Informatik II Musterlösung

Aufgabenblatt: Arrays

Grundlagen der Programmierung

Übung Datenstrukturen. Sortieren

Suchen und Sortieren (Die klassischen Algorithmen)

2 Sortieren durch Vergleichen Eingabefolge a 1, a 2,..., a n 2, 1, 3 Sortieralg. Für festes n ist ein vergleichsbasierter Sortieralg. charakterisiert

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

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

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

Algorithmen und Datenstrukturen 1-3. Seminar -

Datenstrukturen und Algorithmen

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

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

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

4. Sortieren 4.1 Vorbemerkungen

Übungsblatt 7. Thema: Sortieren, Objektorientierung

Bucketsort. Korrektheit. Beispiel. Eingabe: Array A mit n Elementen im Bereich [0,1) Annahme: die Elemente sind in [0,1) gleichverteilt.

JAVA - Suchen - Sortieren

Informatik II Prüfungsvorbereitungskurs

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

Aufgabe : Laufzeit von Selection Sort

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

Aufgabe (Schreibtischtest, Algorithmenanalyse)

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

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

Informatik B Sommersemester Musterlösung zur Klausur vom

public class SternchenRechteckGefuellt {

8.1.3 Operation Build-Max-Heap Operation zur Konstruktion eines Heaps Eingabe: Feld A[1..n], n = länge(a) BUILD-MAX-HEAP (A)

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

Einführung in die Informatik 2

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Algorithmen und Datenstrukturen

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Sortierverfahren für Felder (Listen)

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

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

Einstieg in die Informatik mit Java

Tutoraufgabe 1 (Hoare-Kalkül):

2.2 Allgemeine (vergleichsbasierte) Sortierverfahren

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

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

Tutoraufgabe 1 (Sortieren): Lösung: Datenstrukturen und Algorithmen SS14 Lösung - Übung 4

Heapsort / 1 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8]

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

Informatik Abitur Bayern 2017 / II - Lösung

II.3.1 Rekursive Algorithmen - 1 -

// Objekt-Methoden: public void insert(int x) { next = new List(x,next); } public void delete() { if (next!= null) next = next.next; } public String

Java - Programmierung - Prozedurale Programmierung 1

4. Sortierverfahren. Anwendungen

4. Sortierverfahren. Anwendungen. Sortierverfahren. Sortierverfahren (2)

Kapitel 6 Elementare Sortieralgorithmen

Programmierung mit C Algorithmen

Aufgabenblatt 5. Kompetenzstufe 1. Allgemeine Informationen zum Aufgabenblatt:

Informatik I (D-ITET)

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Datenstrukturen und Algorithmen. 7. Suchen in linearen Feldern

Informatik II Prüfungsvorbereitungskurs

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Transkript:

Vorlesung Informatik 2 Algorithmen und Datenstrukturen (08 - Einfache Sortierverfahren) Prof. Dr. Susanne Albers

Sortieren Motivation, Einführung Datenbestände müssen sehr oft sortiert werden, etwa um Zuordnungen herzustellen oder um darin suchen zu können. Im täglichen Leben werden ebenfalls oft Dinge sortiert. Mögliche Strategien etwa beim Sortieren von Spielkarten sind: 1. Alle Karten kommen in die Hand, anschließend werden benachbarte Karten (in korrekte Reihenfolge) getauscht, bis alle korrekt sind Bubble Sort 2. Die jeweils niedrigste Karte wird vom Tisch in die Hand genommen und an die schon sortierten dort angefügt Selection Sort 3. Karten werden in beliebiger Reihenfolge aufgenommen und jeweils an der richtigen Stelle (die zu suchen ist) in die sortierten in der Hand eingefügt Insertion Sort 2

Rahmenbedingungen beim Sortieren Die zu sortierenden Datensätze können beliebig strukturiert sein. Der Sortierschlüssel ist Teil jedes Datensatzes. Davon kann es mehrere geben. Das Sortieren ändert die Reihenfolge von Datensätzen oder beschreibt (etwa durch Angabe einer Folge von Operationen) wie die korrekte Reihenfolge erreicht werden kann. Internes Sortieren: Anzahl der Datensätze ist so begrenzt, dass alle gleichzeitig in den Speicher passen. Externes Sortieren: Anzahl der Datensätze ist zu groß, um sie alle gleichzeitig im Speicher zu halten. Kann auf Internes Sortieren zurückgeführt werden: 1. Die zu sortierende Datei wird in Teile zerlegt, die jeweils intern sortiert werden können. 2. Die Teile werden sortiert. 3. Die Ergebnisdatei wird aus den sortierten Teilen zusammengemischt: Dazu ist ein Datensatz pro Teil im Speicher ausreichend, der kleinste wird zum Ergebnis hinzugefügt und durch seinen Nachfolger aus der Ursprungsdatei ersetzt. 3

Klassifikationsmöglichkeiten für Sortierverfahren Methode des Verfahrens Vertauschen, Einfügen, Auswählen Vorsortierung ausnutzen Rekursion, Iteration Verwendung spezieller Datenstrukturen Effizienz O(n 2 ), O(n log n), O(n) Verwendung von zusätzlichem Speicher Allgemeine Verfahren oder Verfahren mit speziellen Voraussetzungen A: Nur Schlüsselvergleiche A: Reihenfolge von Daten ändern A: Kann Reihenfolge von Daten mit gleichem Sortierschlüssel geändert werden? (Stabilität) S: Wird eine bestimmte Schlüsselstruktur vorausgesetzt? 4

Untere Komplexitätsschranke für Sortierverfahren (1) Satz. Jeder Sortieralgorithmus für n Elemente, der ausschließlich auf Schlüsselvergleichen und Elementvertauschungen beruht, hat eine worst-case Laufzeit Ω(n log n). Am Ende des Sortiervorgangs muss eine von n! Permutationen der n Elemente erzeugt worden sein. Jeder Ausgang eines Vergleiches liefert Informationen um die in Frage kommende Menge von Permutationen in zwei Teile zu zerlegen. 5

Untere Komplexitätsschranke für Sortierverfahren (2) Der entstehende Entscheidungsbaum mit n! Blättern ist im besten Fall balanciert. Die Höhe des Baumes ist also log n! Mit der Stirlingschen Formel folgt dann der Satz. n! 2π n n e n 6

Rahmen für Sortierverfahren Sortierverfahren sollten immer so geschrieben sein, dass sie mit beliebigen Datentypen operieren können. Das bedingt einen gewissen Zusatzaufwand. Für die Darstellung der Verfahren wird im Folgenden der Einfachheit halber ein Array von Zeichen (char) sortiert. Wir verwenden ein simples Rahmenprogramm. class CharSort { public static void main (String args[]) { char [] a = " thequickbrownfoxjumpsoverthelazydog".tochararray(); System.out.println ("Zeichen-Sortierprogramme\n"); System.out.println (a); System.out.print ("bubblesort: "); Sorter.bubbleSort (a); System.out.println (a); } // main } // CharSort 7

Die Sorter-Klasse Die Sorter-Klasse vereint verschiedene Sortier-Algorithmen sowie Hilfs-Methoden: class Sorter { private final static void swap (char[] a, int i, int k){ char h = a[i]; a[i] = a[k]; a[k] = h; } // swap // verschiedene Sortier-Verfahren... } // Sorter Die Ausgabe eines Sortierlaufs sieht dann etwa so aus: C:\algo>java CharSort Zeichen-Sortierprogramme thequickbrownfoxjumpsoverthelazydog bubblesort: abcdeeefghhijklmnoooopqrrsttuuvwxyz 8

Bubble Sort Wiederholung: Das Blasen-Aufstiegs-Verfahren static void bubblesort (char[] a){ int hi = a.length-1; for (int k = hi; k > 0; k--){ boolean test = true; for (int i = 0; i < k; i++) if (a[i] > a[i+1]) { swap (a, i, i+1); test = false; } if (test) break; } } // bubblesort Beginnend mit dem höchsten Index wird das Array sortiert. Vorsortierung wird ausgenutzt. Laufzeiten in O(n²) im worst und average case sowie Ο(n) im best case. 9

Selection Sort (1) Suche das kleinste der verbleibenden Elemente und hänge es an den bisher sortierten Bereich (durch Tausch) an. Am Ende ist alles sortiert. static void selectionsort (char[] a){ int hi = a.length-1; for (int k = 0; k < hi; k++){ int min = minpos (a, k, hi); // finde minpos im Rest if (min!= k) swap (a, min, k); // tausche es nach k } } // selectionsort private static int minpos (char[] a, int lo, int hi){ int min = lo; for (int i = lo+1; i <= hi; i++) if (a[i] < a[min]) min = i; return min; } // minpos 10

Selection Sort (2) Äußere Schleifendurchläufe: (n - 1) Bestimmung von minpos (a,k,hi): (n - k) Vergleiche. Gesamtaufwand: O(n²) Vorteil: Nur (n - 1) Vertauschungen, besser als bei Bubble Sort. Nachteil: Bei Vorsortierung keine Verbesserung. 11

Insertion Sort (1) Das erste Element des noch unsortierten Bereiches wird genommen und in den schon sortierten an der richtigen Stelle (durch Tausch) eingefügt. Die bereits sortierten Elemente oberhalb der Einfügestelle müssen dazu je um eine Position verschoben werden. static void insertionsort (char[] a){ int hi = a.length-1; for (int k = 1; k <= hi; k++) if (a[k] < a[k-1]){ char x = a[k]; int i; for ( i = k; ( (i > 0) && (a[i-1] > x) ) ; i-- ) a[i] = a[i-1]; // rechts schieben a[i] = x; // einfuegen } } // insertionsort 12

Insertion Sort (2) Aufwand wieder in O(n²) im Mittel und im worst case. Es werden viele Vertauschungen ausgeführt. Vorsortierung ist von Vorteil. 13

Shell Sort (1) Shell Sort kann als Variante von Insertion Sort angesehen werden (Donald Shell). Es werden mehrere Durchgänge gemacht, deren letzter mit Insertion Sort übereinstimmt. Frühere Durchgänge erhöhen die Vorsortierung, so dass spätere Durchgänge weniger zu tun haben. Insgesamt kann der Aufwand gegenüber Insertion Sort verbessert werden, auch in Größenordnungen. Er liegt unter O(n 1.5 ), experimentell belegt in O(n 1.25 ). Es wird eine (mit h statt 1) parametrisierte Version von Insertion Sort benutzt. 14

Shell Sort: Beispiel h 3 = 5, h 2 = 3, h 1 = 1 Eingabefolge: d a f e b c g h 3 = 5 d a f e b c g c a f e b d g h 2 = 3 c a f e b d g c a d e b f g h 1 = 1 c a d e b f g a b c d e f g 15

Shell Sort (2) private static void insertionsorth (char[] a, int h){ int i, hi = a.length-1; for (int k = h; k <= hi; k++) if (a[k] < a[k-h]){ char x = a[k]; for ( i = k; ( (i > (h-1)) && (a[i-h] > x) ) ; i-=h ) a[i] = a[i-h]; a[i] = x; } } // insertionsorth 16

Shell Sort (3) Die parametrisierte Version von Insertion Sort wird nun für immer kleiner werdende Werte von h aufgerufen: h =..., 1093, 364, 121, 40, 13, 4, 1 static void shellsort (char[] a){ int hi = a.length-1; int hmax, h; for (hmax = 1; hmax < hi ; hmax = 3*hmax+1 ); // 1, 4, 13, 40, 121, 364, 1093..., 3*h+1 for ( h = hmax/3; h > 0; h /= 3) insertionsorth (a, h); } // shellsort Der erste Wert von h muss kleiner sein als n Experimentell hat man noch bessere Folgen für h ermittelt, etwa: 16001, 3905, 2161, 929, 505, 209, 109, 41, 19, 5, 1 17