Grundlegende Sortieralgorithmen

Ähnliche Dokumente
Grundlegende Sortieralgorithmen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

JAVA - Suchen - Sortieren

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

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

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

Algorithmen und Datenstrukturen 1

Suchen und Sortieren (Die klassischen Algorithmen)

Grundlagen der Programmierung

Kapitel 6 Elementare Sortieralgorithmen

Programmieren I. Kapitel 7. Sortieren und Suchen

Folge 13 - Quicksort

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

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

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

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

Grundlagen der Programmierung 2. Sortierverfahren

Sortierverfahren für Felder (Listen)

Überblick. Lineares Suchen

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

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

Datenstrukturen und Algorithmen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 1. Einführung und Grundbegriffe

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

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

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

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

Einführung in die Informatik 2

Abschnitt: Algorithmendesign und Laufzeitanalyse

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

Vom Leichtesten zum Schwersten Sortieralgorithmen

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

EndTermTest PROGALGO WS1516 A

ALP I. Funktionale Programmierung

Einstieg in die Informatik mit Java

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

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

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

Sortieralgorithmen. Vorlesung Algorithmen und Datenstrukturen 2. Prof. Dr. W. P. Kowalk Universität Oldenburg

Übung Grundlagen der Programmierung. Übung 05: Arrays. Abgabetermin: xx.xx.xxxx. Java-Programm Testplan Testergebnisse

Sortieren. Eine Testmenge erstellen

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

Algorithmen und Datenstrukturen

Asymptotische Laufzeitanalyse: Beispiel

Ausgewählte Algorithmen: Sortieren von Listen

Informatik II Musterlösung

Objektorientierte Programmierung

4 Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Sortieren

Suchen und Sortieren Sortieren. Heaps

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Teil III: Evaluationstest

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

Vererbung. Martin Wirsing. Ziele. Vererbung

Binärbäume. Prof. Dr. E. Ehses,

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 1. Einführung und Grundbegriffe

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

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Praktische Informatik I Der Imperative Kern Suchen, Selektieren und Sortieren

Programmiertechnik II

Teil 6: Algorithmen und Datenstrukturen 6.3 Suchalgorithmen Prof. Dr. Max Mühlhäuser FG Telekooperation TU-Darmstadt

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

Schulinternes Curriculum im Fach Informatik

Institut für Programmierung und Reaktive Systeme 24. Juni Programmieren II. 14. Übungsblatt

Einführung in die Informatik 2

Programmierung mit Feldern OOPM, Ralf Lämmel

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Algorithmentheorie Randomisierung. Robert Elsässer

Grundlagen der Programmierung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

4 Algorithmen und Datenstrukturen

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

Programmieren ++ Begleitende Übungen zu Veranstaltungen + Umsetzen des Algorithmus in ein lauffähiges Programm

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

Wirtschaftsinformatik I

Algorithmen und Datenstrukturen 1

Einführung in die Informatik 1

Inf 12 Aufgaben

Einführung in die Programmierung Vorlesungsprüfung

Propädeutikum zur Programmierung

Suchen in Listen und Hashtabellen

Gruppenunterricht zum Thema: Sortierverfahren. Berufsschule / Gymnasium

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

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

Algorithmen und Datenstrukturen

Test-Driven Design: Ein einfaches Beispiel

Leitprogramm Bubblesort

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 8. Arrays. Arrays

12. Rekursion Grundlagen der Programmierung 1 (Java)

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

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Transkript:

Grundlegende Sortieralgorithmen Martin Wirsing in Zusammenarbeit mit Michael Barth, Philipp Meier und Gefei Zhang 01/05 2 Ziele Grundlegende Sortieralgorithmen auf Reihungen kennen lernen

3 Klassifizierung Das Sortieren dient dem schnelleren Wiederfinden von Informationen. Beispiele für sortierte Informationsmengen: Lexika, Tabellen, Adressbücher, Kataloge usw. Man unterscheidet internes Sortieren: Die zu sortierende Folge befindet sich im Hauptspeicher (wahlfreier Zugriff) und externes Sortieren: Die zu sortierende Folge ist auf externe Speichermedien wie Bänder oder Platten ausgelagert (i.a. sequentieller Zugriff) 4 Sortieren in Java Man kann Sortierverfahren in einem imperativem oder einem objektorientierten Stil programmieren. Imperativ wählt man eine Klassenmethode und übergibt die zu sortierende Reihung als formalen Parameter, daraus resultieren folgende Methodenköpfe: static void sort (int[] a) bzw. static void sort (Object[] a)

5 Sortieren in Java Objekt-orientiert steht die zu sortierende Reihung in einem Attribut und man übergibt (nur) das aktuelle Objekt; man erhält folgendes Schema für eine Sortierklasse: class SortIntOO = { int[] arr; /* Gibt die aktuelle Reihung zurück **/ int[] getarray () { return arr; /* Vertauscht die Elemente der Reihung mit den Indizes i und j **/ void tausche(int i, int j) { int hilf = arr[i]; arr[i] = arr[j]; arr[j] = hilf; /*Sortiert die Reihung in aufsteigender Reihenfolge **/ void sort(){... 6 Drei typische Sortieralgorithmen Direktes Aussuchen, Bubblesort, Quicksort.

7 Sortierproblem Sei A ein Alphabet oder eine (nicht unbedingt endliche) geordnete Menge von Elementen. Eine Folge v = v 1... v n heißt geordnet, falls v i <= v i+1 für i = 1,..., n-1. Sortierproblem: Gegeben sei eine Folge v = v 1... v n in A. Ordne v so um, daß eine geordnete (oder invers geordnete) Folge entsteht. Genauer: Gesucht wird eine Permutation π : {1,..., n w = v π1... v πn geordnet ist. {1,..., n, so daß die Folge ) 8 Direktes Aussuchen ( Select Sort ) Idee: Wiederholtes Durchsuchen des unsortierten Teil des Feldes nach dem kleinsten Element, welches dann mit dem ersten Element noch unsortierten Teils vertauscht wird. Die Länge des zu sortierenden Feldes verringert sich so bei jedem Durchlauf um eins. Bemerkung: Ist bei einem Sortierschritt das nächste Element bereits am richtigen Platz, so müßte natürlich nicht vertauscht werden. Allerdings macht die zusätzliche Abfrage das Programm langsamer, so daß man diesen (i.a. relativ seltenen) Fall besser schematisch behandelt.

9 Beispiel: Direktes Aussuchen ( Select Sort ) 5 33 12 13 8 1 1 33 12 13 8 5 1 5 12 13 8 33 1 5 8 13 12 33 10 Selectsort in Java (imperativ) public static void sort (int a []) { for (int outer = 0; outer < a.length; outer++) { int min = outer; SelectSort Applet /*kleinstes Element suchen, Index nach min*/ for (int inner = outer + 1; inner < a.length; inner++) if (a[inner] < a[min]) min=inner; tausche(a, outer, min);

11 Vertauschen zweier Elemente einer Reihung public static void tausche (int[] a, int i, int j) { int hilf = a[i]; a[i] = a[j]; a[j] = hilf; 12 Selectsort in Java (objekt-orietiert) public class SelSortOO { private int[] arr; public SelSortOO (int[] a) { arr = a; public int[] getarray() { return arr; public void tausche (int i, int j) {... public void sort () { for (int outer = 0; outer < arr.length; outer++) { int min = outer; /*kleinstes Element suchen, Index nach min*/ for (int inner = outer + 1; inner < arr.length; inner++) if (arr[inner] < arr[min]) min=inner; tausche(outer, min);

13 Da das restliche Feld stets bis zum Ende durchsucht wird, ist der Aufwand nur von der Länge n der Reihung, aber nicht vom Inhalt der Reihung abhängig. Anzahl der Vergleichsoperationen: C max (n) = C ave (n) = Σ i=1 (n-i) Anzahl der Vertauschungen: = n(n-1) - (n/2)(n-1) = (n/2) (n-1) ε O(n 2 ) V max (n) = V ave (n) = Σ i=1 1 = n-1 ε O(n) Zeitkomplexität: n-1 n-1 T w selectsort (n) = Tave selectsort (n) ε O(n2 ) Aufwandsabschätzung 14 Sortieren durch Vertauschen ( Bubble Sort ) Idee: Vertausche benachbarte Elemente, wenn sie nicht wie gewünscht geordnet sind. In jedem Durchlauf des Feldes steigt das relativ größte Element wie eine "`Blase"' (bubble) im Wasser auf, was dem Verfahren seinen Namen gegeben hat.

Beispiel: Bubble Sort 5 33 12 13 8 1 15 Nach erster Runde ist das größte Element außen 5 12 13 8 1 33 5 12 8 1 13 33 5 8 1 12 13 33 Nach zwei Runden sind die beiden größten Elemente geordnet 5 1 8 12 13 33 16 Bubble Sort in Java public static void sort(int[] a) { for (int outer = a.length-1; outer>0; outer--) { for (int inner=0; inner<outer; inner++) { if (a[inner]>a[inner+1]) tausche(a,inner,inner+1);

17 Aufwandsabschätzung Anzahl der Vergleichsoperationen (wie bei selectsort): C min (n) = C max (n) = C ave (n) = Σ i=1 i = (n/2) (n-1) ε O(n 2 ) Anzahl der Vertauschungen: Schlechtester Fall: (wenn die Elemente in der falschen Reihenfolge, d.h. absteigend geordnet sind): V max (n) = Σ i=1 (n-i) = n(n-1) - (n/2)(n-1) = (n/2) (n-1) ε O(n 2 ) Durchschnittlicher Fall: V ave (n) = Σ i=1 (n-i)/2 = (n/4)(n-1) ε O(n 2 ) Zeitkomplexität: n-1 n-1 T w bubblesort (n) = Tave bubblesort (n) ε O(n2 ) n-1 18 Quicksort (von C.A.R. Hoare) Quicksort ist nach Heapsort der schnellste bekannte interne Sortieralgorithmus, da Austauschen am effizientesten ist, wenn es über große Distanzen erfolgt. Idee: Man wählt aus dem Array irgendein Element als Pivot (z.b. das am weitesten rechts stehende Element) aus und läuft von der linken und der rechten Grenze der Reihung solange nach innen, bis ein nicht kleineres (auf der linken Seite) und ein nicht größeres (auf der rechten Seite) Element gefunden sind. Diese beiden werden dann vertauscht. Man wiederholt das Ganze solange, bis sich die beiden Indizes getroffen haben. Das Pivotelement wird dann in die Mitte getauscht (mit dem Element, das auf dem Platz des linken Index steht). Jetzt hat man zwei Teilfelder, wobei das eine nur Elemente kleiner oder gleich dem Grenzwert und das andere nur Elemente größer oder gleich dem Grenzwert enthält. Diese beiden Teilfelder werden entsprechend dem oben beschriebenen Algorithmus rekursiv weiter sortiert, bis nur noch einelementige und damit sortierte Teilfelder vorhanden sind.

19 Beispiel: Quicksort Linken Teil sortieren 33 15 8 12 1 13 1 12 8 15 33 13 1 12 8 13 33 15 1 8 12 13 15 33 Partitionierung bilden Pivotelement vertauschen Rechten Teil sortieren 20 static void sort(int[] a) { sort(a, 0, a.length-1); Quicksort rekursiv static void sort(int[] a, int left, int right) { if (right-left> 0) // nur sortieren, wenn Groesse >= 2 { double pivot = a[right]; // Element ganz rechts int partition = partitionit(a, left, right, pivot); sort(a, left, partition-1); // sortiere linke Seite sort(a, partition+1, right); // sortiere rechte Seite

21 Partitionierung der Reihung public int partitionit(int[] a, int left, int right, double pivot) { int leftptr = left; int rightptr = right-1; while(leftptr<=rightptr) { while( a[leftptr] < pivot )leftptr++; // finde nichtkleineres Elem while(rightptr >=0 && a[rightptr] > pivot)rightptr--; // finde nichtgroesseres Elem if (leftptr<=rightptr) { if(leftptr<rightptr)tausche(a, leftptr,rightptr); leftptr++;rightptr--; tausche(a, leftptr, right); // setze pivot an richtige Stelle return leftptr; // return Index des pivot Elements 22 Verbesserungen des Quicksort-Algorithmus Bei kurzen Reihungen sind die einfachen Sortieralgorithmen meist besser, deshalb kann man Teilreihungen mit weniger als 10 Elementen manuell sortieren Eine bessere Pivotbestimmung ergibt sich aus dem mittleren Wert der drei folgenden Elemente der Reihung: linkes Element, rechtes Element und das Element in der Mitte der Reihung

23 Aufwandsabschätzung n Vergleiche pro Iteration n Iterationen Schlechtester Fall: O(n * n) z.b. wenn die Reihung schon aufsteigend sortiert ist: Partitionieren Partitionieren Partitionieren... Partitionieren 24 n Vergleiche pro Iteration Aufwandsabschätzung log 2 n Iterationen Durchschnittlicher Fall: O(n * log 2 n) Idee: Jede Partitionierung benötigt n Vergleiche, Bei Teilung der Reihung in jeweils ungefähr gleich große Hälften benötigt man log 2 n Iterationen.

25 Zusammenfassung Sortieren durch Einfügen und Bubblesort sind Sortieralgorithmen mit quadratischer Zeitkomplexität. Quicksort hat im Mittel die Zeitkomplexität n log n. Im schlechtesten Fall ist es n 2.