Grundlegende Sortieralgorithmen

Ähnliche Dokumente
Grundlegende Sortieralgorithmen

Grundlegende Sortieralgorithmen

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Interne Sortierverfahren

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Elementare Sortierverfahren

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

JAVA - Suchen - Sortieren

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

(08 - Einfache Sortierverfahren)

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

Algorithmen und Datenstrukturen 1

Ziele. Kapitel 10: Komplexität von Algorithmen und Sortierverfahren. Beispiel: Lineare Suche eines Elements in einem Array (1)

Folge 13 - Quicksort

Datenstrukturen & Algorithmen

Suchen und Sortieren

Suchen und Sortieren (Die klassischen Algorithmen)

Grundlagen der Programmierung

3.2. Divide-and-Conquer-Methoden

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

Algorithmen und Datenstrukturen 12

Informatik II Sortieren

QuickSort ist ein Sortieralgorithmus, der auf der Idee des Teile & Beherrsche beruht, und das gegebene Array an Ort und Stelle (in place) sortiert

7. Sortieren Lernziele. 7. Sortieren

Die Schnittstelle Comparable

Übung Datenstrukturen. Sortieren

Heapsort. Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen / 50

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

Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07

Kapitel 6 Elementare Sortieralgorithmen

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

Sortieralgorithmen. Selection Sort

Algorithmen und Datenstrukturen

Übung Algorithmen I

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

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

Abschnitt 19: Sortierverfahren

Prof. Dr. Margarita Esponda

Sortieralgorithmen OOPM, Ralf Lämmel

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

Programmieren I. Kapitel 7. Sortieren und Suchen

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

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

Suchen und Sortieren Sortieren. Mergesort

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

Grundlagen der Programmierung 2. Sortierverfahren

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

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

Einfache Sortierverfahren in Java, 1. Version

4. Sortieren 4.1 Vorbemerkungen

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

Heapsort. Erstellung eines Heaps

Heapsort. 1. Erstelle aus dem gegebenen Array einen Heap (DownHeap) 2. Tausche erstes und letztes Element des Arrays

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

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

Sortieren durch Mischen (Mergesort; John von Neumann 1945)

Christoph Niederseer, Michaela Mayr, Alexander Aichinger, Fabian Küppers. Wissenschaftl. Arbeitstechniken und Präsentation

Einführung in die Informatik Algorithmen und Datenstrukturen. Thema 17 Sortieren

Algorithmen und Datenstrukturen (für ET/IT)

Übung: Algorithmen und Datenstrukturen SS 2007

Datenstrukturen. Sortieralgorithmen. am Beispiel Java. c Y. Pfeifer. (Mai 2013)

Übungsblatt 7. Thema: Sortieren, Objektorientierung

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

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

Klausur - Informatik I SS 05. Note: Bearbeitungszeit 120 Minuten Keine Hilfsmittel

Sortieren Anordnen einer gegebenen Menge von Objekten in einer bestimmten Ordnung.

Algorithmen und Datenstrukturen

Kapitel 2. Weitere Beispiele Effizienter Algorithmen

Datenstrukturen und Algorithmen

Sortieren und Suchen. Jens Wächtler Hallo Welt! -Seminar LS 2

Datenstrukturen & Algorithmen

14. Sortieren II Heapsort. Heapsort. [Max-]Heap 7. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Übung Algorithmen und Datenstrukturen

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

Tutoraufgabe 1 (Hoare-Kalkül):

6 Quicksort. die mittlere Laufzeit Θ(n log n) beträgt und. die in der asymptotischen Notation verborgenen Konstanten sehr klein sind.

Transkript:

Grundlegende Sortieralgorithmen Martin Wirsing in Zusammenarbeit mit Matthias Hölzl und Nora Koch Sortieren in Java Man kann Sortierverfahren in einem imperativem oder einem objektorientierten Stil programmieren. Imperativ wählt man eine Klassenmethode und übergibt die zu de Reihung als formalen Parameter, daraus resultieren folgende Schnittstellen: interface SortInt { static void sort (int[] a) bzw. interface SortObject { static void sort (Object[] a) 4 01/04 2 5 Ziele Grundlegende Sortieralgorithmen auf Feldern kennenlernen Sortieren in Java Objekt-orientiert steht die zu de 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(){... 3 6 Klassifizierung Drei typische Sortieralgorithmen Das Sortieren dient dem schnelleren Wiederfinden von Informationen. Direktes Aussuchen, Beispiele für sortierte Informationsmengen: Bubblesort, Lexika, Tabellen, Adressbücher, Kataloge usw. Quicksort. Man unterscheidet internes Sortieren: Die zu de Folge befindet sich im Hauptspeicher (wahlfreier Zugriff) und externes Sortieren: Die zu de Folge ist auf externe Speichermedien wie Bänder oder Platten ausgelagert (i.a. sequentieller Zugriff)

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,...,. 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 7 Selectsort in Java (imperativ) public static void sort (int a []) { for (int outer = 0; outer < a.length; outer++) SelectSort { int min = outer; /*kleinstes Element suchen, Index nach min*/ Applet for (int inner = outer + 1; inner < a.length; inner++) if (a[inner] < a[min]) min=inner; tausche(a, outer, min); 10 ) 8 11 Direktes Aussuchen ( Select Sort ) Vertauschen zweier Elemente einer Reihung 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 den 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. public static void tausche (int[] a, int i, int j) { int hilf = a[i]; a[i] = a[j]; a[j] = hilf; 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 9 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 16 Bubble Sort in Java 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) = n() - (n/2)() = (n/2) () ε O(n 2 ) Anzahl der Vertauschungen: V max (n) = V ave (n) = Σ i=1 1 = ε O(n) 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); Zeitkomplexität: T w selectsort (n) = Tave selectsort (n) ε O(n2 ) 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. 14 Anzahl der Vergleichsoperationen (wie bei selectsort): C min (n) = C max (n) = C ave (n) = Σ i=1 i = (n/2) () ε 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/2)() = (n/2) () ε O(n 2 ) 17 Durchschnittlicher Fall: V ave (n) = Σ i=1 (n-i)/2 = (n/4)() ε O(n 2 ) Zeitkomplexität: T w bubblesort (n) = Tave bubblesort (n) ε O(n2 ) Beispiel: Bubble Sort 5 33 12 13 8 1 5 12 13 8 1 33 5 12 8 1 13 33 5 8 1 12 13 33 5 1 8 12 13 33 15 Nach erster Runde ist das größte Element außen Nach zwei Runden sind die beiden größten Elemente geordnet 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. 18

19 22 Beispiel: Quicksort Verbesserungen des Quicksort-Algorithmus Linken Teil 33 15 8 12 1 13 1 12 8 15 33 13 1 12 8 13 33 15 Partitionierung bilden Pivotelement vertauschen Rechten Teil Bei kurzen Reihungen sind die einfachen Sortieralgorithmen meist besser, deshalb kann man Teilreihungen mit weniger als 10 Elementen manuell 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 1 8 12 13 15 33 20 23 Quicksort rekursiv static void sort(int[] a) n Vergleiche pro Iteration n Iterationen { sort(a, 0, a.length-1); Schlechtester Fall: O(n * n) z.b. wenn die Reihung schon aufsteigend sortiert ist: static void sort(int[] a, int L, int R) { if (R-L > 0) // nur, wenn Groesse >= 2 { double pivot = a[right]; // Element ganz rechts int partition = partitionit(a, left, right, pivot); sort(a, left, partitio); // sortiere linke Seite sort(a, partition+1, right); // sortiere rechte Seite... 21 24 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 n Vergleiche pro Iteration 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.