Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Sortierverfahren Richard Göbel.

Ähnliche Präsentationen


Präsentation zum Thema: "Sortierverfahren Richard Göbel."—  Präsentation transkript:

1 Sortierverfahren Richard Göbel

2 Sortierte Ausgabe von Studentennamen
public class Vorlesung { String bezeichnung; Dozent dozent; int sws; int ects; Student[] teilnehmer; int anzTeilnehmer; } public abstract class Person String name; public class Student extends Person . . .

3 Sortierverfahren - Anwendungen
Sortierte Ausgabe von Daten Effiziente Algorithmen Suchen in sortierten Listen Vergleich von Elementen verschiedener Listen . . . und andere . . .

4 Sortierverfahren - Voraussetzung
Elemente müssen vergleichbar sein Zahlen Zeichenketten Allgemein: Totale Ordnung Eine Liste [x1, x2, , xn] ist sortiert g.d.w.:

5 Einfaches Sortierverfahren (Bubble Sort)
Überprüfe ob die Liste sortiert ist Falls die Sortierbedingung an einer Stelle verletzt ist, dann tausche die entsprechenden Elemente Wiederhole dieses Verfahren, bis die Liste sortiert ist Dieses Verfahren ist nicht effizient!

6 Effizientes Sortieren
Aufwand für Sortierverfahren: Vergleich von Elementen Einfügen von Elementen in eine sortierte Liste Ansatz: Verringere die Anzahl der Vergleichsoperationen Vermeide Verschieben einer Teilliste beim Einfügen

7 Sortieren - Ideen für ein Verfahren
Identifiziere schrittweise alle größten (kleinsten) Elemente einer Liste und speichere diese in ihrer Reihenfolge Teile und Beherrsche: Aufteilung der großen Liste in kleinere Listen und Sortieren der Teillisten Sortieren durch Fachverteilung

8 Sortieren - Größtes Element
Finde das größte Element der Liste Vertausche das größte Element mit dem letzten Element der Liste Setze das Verfahren mit der Liste ohne das letzte Element fort Endbedingung: Die Liste enthält nur noch ein Element Bezeichnung – "Insertion Sort" Achtung: Andere Versionen existieren!

9 Sortieren - Finde Größtes Element, Insertion Sort
. . . max = list[0]; pos = 0; for (int i = 1; i < list.length; i++) { if (max < list[i]) max = list[i]; pos = i; }

10 Sortieren - Diskussion Insertion Sort
Anzahl Vergleiche: n + (n -1) = (n2+n)/2 Zeitaufwand: O(n2) Es werden eine Vielzahl von Vergleichsoperationen bei jedem Durchgang wiederholt! Ein verbesserter Ansatz sollte Ergebnisse mindestens einiger Vergleiche speichern Ansatz hier: Aufbau einer entsprechenden Datenstruktur auf der Basis eines binären Baums

11 Binärer Baum als so genannter „Heap“
x1 x2 x3 x4 x5 x6 x7

12 Aufbau des Heap Bottom-Up: Bearbeite Baum von unten nach oben
Finde nicht bearbeiteten Knoten dessen Kinder bereits bearbeitet wurden Tausche Element mit dem größten Nachfolger falls nötig Wende Top-Down-Methode auf das betroffen Kind an falls vertauscht wurde Top-Down: Bearbeite Baum von oben nach unten Beende die Methode falls keine Vertauschung nötig ist oder ein Blatt erreicht wurde

13 Aufbau des Heap - Bottom Up
Vertauschen! 1 2 Bis hier bereits fertig! 5 8 4 3

14 Aufbau des Heap - Top Down
1 8 4 3 2 5 4 2 Evtl. weiter nach unten

15 Darstellung des Heap - Idee
Für den Heap soll keine komplexe Darstellung aufgebaut werden Idee: Darstellung des Heap direkt auf dem Array Position i hat die Nachfolger: 2 * i 2 * i + 1

16 Darstellung des Heap - Beispiel
12 12 13 6 24 38 41 7 15 3 1 26 42 16 17 49 13 6 24 38 41 7 15 3 1 26 42 16 17 49

17 1: Baue den Heap auf einem Array der Länge n auf:
Heap Sort - Ansatz 1: Baue den Heap auf einem Array der Länge n auf: Bearbeite schrittweise die Positionen n/2 bis 1 Überprüfe die Nachfolger und vertausche ggf. Elemente (Bottom-Up, Top-Down) 2: Vertausche das erste Element (größtes Element) mit dem letzten Element des Arrays 3: „Blockiere“ das letzte Element (Array wird „virtuell“ um eine Position kleiner) 4: Wende den „Top-Down“-Ansatz auf das erste Element an 5: Wiederhole die Schritte bis das Array sortiert ist

18 Heap Sort - Diskussion Aufwand im schlechtesten Fall: O(log(n)*n)) Kein zusätzlicher Speicherplatz nötig

19 Teile und Beherrsche - Beliebige Aufteilung
Teile die Liste in zwei (fast) gleich große Teillisten Sortiere die Teilliste Erzeuge die Gesamtliste aus den sortierten Teillisten Vergleiche die beiden kleinsten Elemente der sortierten Teillisten Füge das kleinere Element in die Ergebnisliste Wiederhole diese Schritte, bis die beiden Teillisten leer sind Bezeichnung: Merge Sort

20 Aufwand im schlechtesten Fall: O(log(n)*n)) Vergleich mit Heap Sort:
Diskussion Merge Sort Aufwand im schlechtesten Fall: O(log(n)*n)) Vergleich mit Heap Sort: Zusätzlicher Speicher wird benötigt (mindestens in der Größe der zu sortierenden Liste) insgesamt etwas schneller als der Heap Sort

21 Teile und Beherrsche - Aufteilung mit Element
Wähle ein Element p für die Aufteilung aus (Pivot-Element) Erzeuge zwei Teillisten mit Hilfe von p: Die erste Teilliste enthält alle Elemente kleiner oder gleich p Die zweite Teilliste enthält alle Elemente größer als p Sortiere danach die Teilliste und hänge das Ergebnis zusammen Bezeichnung: Quicksort

22 Quicksort - Sortieren innerhalb des Array I
Gegeben linker Grenze l rechte Grenze r Sortiere Liste zwischen l und r einschließlich Entferne erstes Element aus Liste als Pivotelement Nutze freie Position um kleinere Elemente "links" und größere Elemente "rechts" zu speichern Speichere das Pivotelement zwischen den Teillisten Wende Quicksort rekursiv auf die Teillisten an

23 Quicksort - Sortieren innerhalb des Array II
Parameter Startpunkt: links Endpunkt: rechts 14 25 16 27 41 12 . . . 25 Pivotelement: 12 27 16 25

24 Aufwand im durchschnittlichen Fall: O(log(n)*n))
Diskussion Quick Sort Aufwand im durchschnittlichen Fall: O(log(n)*n)) Aufwand im schlechtesten Fall: O(n2) bei sortierter Liste Lösung: Wähle nicht das erste Element sondern ein anderes Element mit zufälliger Position aus Vergleich mit Heap Sort und Merge Sort: kein zusätzlicher Speicher wird benötigt im durchschnittlichen Fall deutlich schneller als die beiden anderen Verfahren

25 Sortierung durch Fachverteilung
Sortiere die Elemente direkt in die Felder eines Arrays ein (Für jeden Wert oder Wertbereich ein Feld) Aufwand ist linear! Probleme: Größe des Arrays? Mehrere Werte in einem Feld? Auslesen des Arrays?


Herunterladen ppt "Sortierverfahren Richard Göbel."

Ähnliche Präsentationen


Google-Anzeigen