25
FH-Hof Sortierverfahren Richard Göbel

FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

Embed Size (px)

Citation preview

Page 1: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

Sortierverfahren

Richard Göbel

Page 2: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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{

. . .}

Page 3: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

Sortierverfahren - Anwendungen

Sortierte Ausgabe von Daten

Effiziente Algorithmen

Suchen in sortierten Listen

Vergleich von Elementen verschiedener Listen

. . . und andere . . .

Page 4: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

Sortierverfahren - Voraussetzung

Elemente müssen vergleichbar sein

Zahlen

Zeichenketten

Allgemein: Totale Ordnung

Eine Liste [x1, x2, . . . , xn] ist sortiert g.d.w.:

:x x x , , :x y z x y y z x z

, :x y x y y x x y

1[1, 1] : i ii n x x

Page 5: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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!

Page 6: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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

Page 7: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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

Page 8: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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!

Page 9: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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;

}

}

. . .

Page 10: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

Sortieren - Diskussion Insertion Sort

Anzahl Vergleiche:

n + (n -1) + . . . + 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

Page 11: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

Binärer Baum als so genannter „Heap“

x1

x2 x3

x4 x5 x6 x7

1 2 3 4 5 6 7, , , , , ,x x x x x x x

2 4 5, ,x x x

3 6 7, ,x x x

Page 12: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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

Tausche Element mit dem größten Nachfolger falls

nötig

Wende Top-Down-Methode auf das betroffen Kind an

falls vertauscht wurde

Beende die Methode falls keine Vertauschung nötig ist

oder ein Blatt erreicht wurde

Page 13: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

Aufbau des Heap - Bottom Up

1

2

4 3

5 8

Bis hier bereits fertig!

Vertauschen!

Page 14: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

Aufbau des Heap - Top Down

1

8

5

4 3

24

2

Evtl. weiter nach unten

Page 15: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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

Page 16: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

Darstellung des Heap - Beispiel

1213

624

3841

715

31

2642

1617

49

1213 6243841715312642161749

Page 17: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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 2 - 4 bis das Array sortiert

ist

Page 18: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

Heap Sort - Diskussion

Aufwand im schlechtesten Fall: O(log(n)*n))

Kein zusätzlicher Speicherplatz nötig

Page 19: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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

Page 20: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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

Page 21: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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

Page 22: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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

Page 23: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

Quicksort - Sortieren innerhalb des Array II

Parameter

Startpunkt: links

Endpunkt: rechts

1425 1627 4112. . . . . .

25Pivotelement:

12 2716 25

Page 24: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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

Page 25: FH-Hof Sortierverfahren Richard Göbel. FH-Hof Sortierte Ausgabe von Studentennamen public class Vorlesung { String bezeichnung; Dozent dozent; intsws;

FH-Hof

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?