Sortieren 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 1 Sortiermethoden (Auswahl) • Allgemeine Methoden: Sortieren in Arrays • Spezielle Methoden: Sortieren von Dateien 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 2 Sortieren in Arrays • Direkte Methoden (langsam, immer 2 verschachtelte Schleifen) – Bubble-Sort (Exchange-Sort, Sortieren durch Austauschen) – Selection-Sort (Sortieren durch Auswählen) – Insertion-Sort (Sortieren durch Einfügen) • Schnelle Methoden – – – – Heap-Sort Quick-Sort Merge-Sort ShellSort 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 3 Sortieren in Arrays • Direkte Methoden (langsam, immer 2 verschachtelte Schleifen) – Bubble-Sort (Exchange-Sort, Sortieren durch Austauschen) – Selection-Sort (Sortieren durch Auswählen) – Insertion-Sort (Sortieren durch Einfügen) • Schnelle Methoden – – – – Heap-Sort Quick-Sort Merge-Sort ShellSort 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 4 Sortieren von Dateien – – – – 3-Band-Mischen Einphasen-Mischen (ausgeglichenes Mischen) Natürliches Mischen Mehrphasen-Mischen 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 5 Bubble Sort Innere Schleife: • Die benachbarten Zahlen werden in ein „bubble“ eingeschlossen und wenn nötig ausgetauscht • Die „Blase“ verschiebt sich bis zum Array-Ende • Nach 1 Durchlauf durch die äußere Schleife ist die größte (oder kleinste) Zahl ermittelt Äußere Schleife: • Falls die größte (kleinste) Zahl bekannt, wird im „Rest-Array“ nach weiterem Maximum (Minimum) gesucht • In der äußeren Schleife werden die Margins für den aktuellen Array-Teil festgelegt 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 6 Bubble Sort - Beispiel 0 1 2 3 4 18 02 37 17 15 02 17 15 18 37 02 18 02 17 15 17 18 37 17 37 15 37 02 15 17 18 37 02 15 02 18 17 15 37 02 18 17 18 02 15 17 18 37 15 18 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 7 Bubble Sort mit Merker - Beispiel 0 1 2 3 4 70 10 20 30 40 … Merker ausgetauscht löschen 10 70 … Tauschen war notwendig, Merker gesetzt 20 70 30 70 40 70 … weiter machen, nur wenn Merker gesetzt 10 20 30 40 70 … Merker ausgetauscht löschen 10 20 … kein Tauschen notwendig, Merker bleibt gelöscht 20 30 30 40 02 15 17 18 37 … kein Tauschen notwendig, Merker bleibt gelöscht … kein Tauschen notwendig, Merker bleibt gelöscht … Schluss machen! 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 8 Selection Sort Wie „intuitives“ Sortieren von wenigen Zahlen: Minimum finden, dann unter den restlichen Zahlen Minimum finden, usw. Innere Schleife: • Die 1. Zahl wird als Minimum bezeichnet • Sollte die nächste Zahl noch kleiner sein, so wird der MimimumEintrag (Variable min) korrigiert • min wird mit der linken Randzahl des aktuellen Array-Abschnitts ausgetauscht Äußere Schleife: • Margins für den aktuellen Array-Abschnitt werden festgelegt 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 9 Selection Sort - Beispiel 0 1 2 3 4 min imin 18 02 37 05 15 18 0 1 1 2 3 4 min imin 02 05 37 18 15 37 2 2 1 18 3 2 1 15 4 2 1 2 1 tauschen 0 1 2 3 4 min imin 02 05 15 18 37 18 3 tauschen 0 0 2 3 4 min imin 18 3 02 18 37 05 15 18 1 kein Tauschen nötig 18 1 0 5 3 5 3 1 2 3 4 02 05 15 18 37 tauschen 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 10 Insertion Sort Sortieren durch Einfügen - Konzept: 2 Zahlen werden sortiert, jede weitere Zahl wird zwischen die bereits sortierten Zahlen „eingefügt“, bzw. am Anfang oder am Ende „einsortiert“ Algorithmische Umsetzung – Grundidee: Äußere Schleife: Von links werden jeweils 2 benachbarte Zahlen in eine „Blase“ eingeschlossen, betrachtet und ggf. ausgetauscht Innere Schleife: • nach jedem in der äußeren Schleife erfolgten Tauschvorgang wird die „Blase“ zurück nach links verschoben und es wird geprüft, ob die Ordnung immer noch stimmt; anderseits werden auch diese Zahlen getauscht • die Rückwärtsprüfung wird abgebrochen, sobald 1x nicht getauscht werden muss • die innere Schleife kommt eventuell nicht einmal zur Ausführung 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 11 Insertion Sort (Grundidee) - Beispiel 0 1 2 3 4 18 02 37 05 15 02 05 18 37 15 15 37 tauschen 0 1 2 3 4 tauschen tauschen 15 18 02 18 37 05 15 kein Tauschen notwendig, aufhörten, weiter nach links nicht mehr prüfen kein Tauschen notwendig, innere Schleife wird gar nicht ausgeführt 0 1 2 3 4 02 18 37 05 15 0 05 37 05 18 tauschen 1 2 3 02 05 15 18 37 tauschen kein Tauschen notwendig 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 4 12 Insertion Sort - Verbesserung Verbesserung der algorithmischen Umsetzung: • es werden nicht die ganzen Tauschvorgänge gemacht, Sondern nur die „halben“ – d.h. zunächst überschreibt der linke Nachbar den rechten • wenn keine Tauschvorgänge mehr nötig sind, erst dann nehmen wir die Zahl die ursprünglich ganz rechts war (diese müssen wir und natürlich vorher merken) und veranlassen, dass diese Zahl die Zahl ganz links überschreibt. • Eigentlich lassen wir dadurch alle am Tauschen beteiligte Zahlen nach rechts rotieren. 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 13 0 1 2 3 4 nächster 0 kopieren 18 18 37 05 15 02 1 2 3 4 37 kein Tauschen notwendig, innere Schleife wird gar nicht ausgeführt 1 2 3 4 3 4 nächster 02 18 37 05 15 nächster 15 02 05 18 37 15 kopieren 05 15 kopieren nächster 02 18 37 05 15 0 2 02 05 18 37 37 Hilfsvariable zurück kopieren 0 1 02 05 18 18 15 15 Hilfsvariable zurück kopieren prüfen, kein Tauschen notwendig, weiter nach links nicht mehr prüfen kopieren 02 18 37 37 15 05 kopieren 02 18 18 37 15 0 1 2 3 4 02 05 15 18 37 05 Hilfsvariable zurück kopieren prüfen, kein 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren Tauschen notw. 14 Insertion Sort (verbessert) - Beispiel 02 18 02 37 05 15 Merge Sort - Vorstudie 2 vorsortierte Arrays in ein 3. Array mischen (mergen) 0 1 2 3 4 Array1 02 05 37 45 57 (Quelle1) 0 1 2 Array2 03 04 41 (Quelle2) 0 1 2 3 4 5 6 7 Array3 (Ziel) • Die kleinere der beiden Zahlen, auf die die Zeiger zeigen, wird in das Zielfeld kopiert • Dort, von wo die Zahl kopiert wurde, verschiebt sich der Zeiger nach rechts 0 1 2 3 4 Array1 02 05 37 45 57 (Quelle1) 0 1 2 0 Array3 (Ziel) Array2 03 04 41 (Quelle2) 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 1 2 3 4 5 6 7 2 • Falls ein Array am Ende, Rest des 15 anderen Array kopieren Merge Sort Idee: • Prinzip: Divide et impera • Array mit unsortierten Zahlen solange teilen, bis 1-Element-Arrays entstehen • In den 1-Element-Arrays sind die Zahlen bereits sortiert!!! • Die Arrays werden in umgekehrter Reihenfolge des Teilens wieder gemischt Programmtechnische Umsetzung: • Rekursiv! • Teil-array teilen und sofort mischen • Rekursiver Abschluß: 1-Element-Arrays Beispiel: 0 1 2 3 4 03 96 71 40 25 03 96 71 03 96 03 71 40 25 40 96 03 96 03 71 96 25 40 03 25 40 71 96 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 16 25 Quick Sort #1 Die Idee: • Prinzip: Divide et impera • Im Array von unsortierten Zahlen wird ein sog. Pivot-Element bestimmt (i.d.R. i.d. Mitte) 0 1 2 3 4 5 6 25 01 20 18 08 31 16 18 = Pivot • Jetzt möchten wir den Zustand erzielen, dass alle Zahlen links vom Pivot kleiner als Pivot sind und umgekehrt; die Zahlen untereinander werden noch nicht sortiert • Dazu suchen wir von links die erste Zahl, die größer ist als Pivot • und gleichzeitig von rechts die erste Zahl, die kleiner ist als Pivot 0 1 2 3 4 5 6 25 01 20 18 08 31 16 L R • Wir tauschen die 2 Zahlen L und R • Nach jedem Tauschen wird L inkrementiert und L dekrementiert 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 17 Quick Sort #2 0 1 2 3 4 5 6 16 01 20 18 08 31 25 L R • Mit der Suche setzen wir fort, anfangend mit dem rechten Nachbar der links gefundenen Zahl und mit dem linken Nachbar der rechts gefunden Zahl • wir gehen aber nie weiter als bis zum Pivot • sollte das Pivot-Element betroffen werden, dann wandert er mit • Dies machen wir, solange sich die zu prüfenden Zahlen nicht begegnen 0 1 2 3 4 5 6 16 01 20 18 08 31 25 L R 16 01 08 18 20 31 25 R L 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 18 wird mit sich selbst getauscht, danach R<L => keine weitere Suche nach18Tauschkandidaten Quick Sort #3 0 1 2 3 4 5 6 16 01 08 18 20 31 25 • Wenn alle Zahlen links vom Pivot kleiner als Pivot und alle Zahlen rechts vom Pivot größer als Pivot sind, wird in entsprechenden Teilen des Arrays Quick-Sort rekursiv ausgeführt: 0 1 2 16 01 08 4 5 6 14 25 16 Quick sort erneut rekursiv Quick sort erneut rekursiv Folgendes muss noch genau überlegt werden: • Kondition für Ende des Suchens/Tauschens • Abschlussbedingungen für die rekursiven Aufrufe Analysieren Sie die Beispielprogramme dazu! 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 19 Die Details: Quick Sort #4 • Abschlussbedingung bei der Suche nach Tauschkandidaten: L>R • Bei der Grobsortierung des Arrays muss nicht unbedingt gelten, dass - die Elemente links vom Pivot < als Pivot und - die Elemente rechts vom Pivot > als Pivot sein müssen • Günstiger: Wir teilen das Array in 2 Teile, wobei alle Elemente im linken Teil < alle Elemente in rechten Teil wobei es auf die Lage des Pivot-Elementes nicht ankommt. Das Pivot-Element kann - am Rande der neuen Aufteilung sein - in der neuen Aufteilung enthalten sein, aber nicht am Rande - gar nicht in der neuen Aufteilung enthalten sein • Die Grenzwerte von rekursiven Aufruf linker Array-Teil: linker Rand bis letzte Position der rechten Zeigers R Die Grenzwerte von rekursiven Aufruf rechter Array-Teil: letzte Position der linken Zeigers R bis rechter Rand • Folglich: Abschlussbedingungen für die rekursiven Aufrufe Rekursion linker Teil: nur wenn linker Rand < letzte Position der rechten Zeigers R Rekursion rechter Teil: nur wenn letzte- Sortieren Position der linken Zeigers R < rechter Rand 20 2009 Jiri Spale, Algorithmen und Datenstrukturen Quick Sort #5 Fortsetzung unseres Beispiels: 2. Instanz – linker Teil 0 1 3. Instanz – rechter Teil des in der 2. Instanz bearbeiteteten linker Teils 2 1 16 01 08 L 16 08 R R L 0 1 2 01 16 08 R 2 L 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren R 1 2 08 16 R L 21 Quick Sort #6 Fortsetzung unseres Beispiels: 2. Instanz – rechter Teil 4 5 3. Instanz – linker Teil des in der 2. Instanz bearbeiteteten rechten Teils 6 4 20 31 25 L 5 20 25 R 20 mit sich selbst tauschen L 4 5 R L 6 4 20 25 31 R 5 20 25 L 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren R R 22 L Quick Sort #7 Fortsetzung unseres Beispiels: Ablaufdiagramm main() quick(0,6) quick(0,2) L L R L R quick(1,2) L R quick(4,5) quick(4,6) L R R 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren … rekursiver Abschluss 23 Quick Sort #8 Eigenschaften: • i.d.R. sehr schnell (sehr kurze innere Schleifen) • kann leider instabil sein • verbraucht wenig Speicherplatz • es gibt mehrere Varianten des Algorithmusses Aufwand: • average case: O(N log N) wenn ca. gleich viele Zahlen kleiner und größer als das Pivot sind • worst case: O(N2) wenn das Pivot das größte (kleinste) Element ist, und das noch bei ca. allen Rekursionen 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 24 Shellsort Sortieren durch Einfügen mit abnehmender Schrittweite: Shell = Hülle, Oberfläche • Shell sortiert Elemente, die in ausgewählter Entfernung auseinander liegen • die Entfernungen (Abstände, Schrittweite) verringern sich mit dem Fortschritt des Verfahrens • gern genommene Abstandsfolgen: {2 } i ∞ i =0 = {1,2,4,8,...} an +1 = 3an + 1; n > 0, a0 = 1....{1,4,13,40,121,...} D.L.Shell (1959) Knuth • es wird mit dem größten Abstand begonnen, der in unseren Datenbestand noch hereinpaßt • zum eigentlichen Sortieren der ausgewählten Elemente wird ein herkömmliches Sortierverfahren eingesetzt • gern genommenen Sortierverfahren: Insertion-Sort (sehr schnell bei vorsortierten Zahlen) , Bubble-Sort mit Merkern, schnelle Verfahren 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 25 Shellsort - Beispiel 1. alle Elemente, die 4 Positionen auseinander liegen, werden zusammengefasst und sortiert 2. alle Elemente, die 2 Positionen auseinander liegen, werden zusammengefasst und sortiert 3. alle Elemente werden zusammengefasst und sortiert Ausgangsfolge: 44 55 12 42 94 18 06 67 4 sortiert 44 18 06 42 94 55 12 67 2 sortiert: 06 18 12 42 44 55 94 67 1 sortiert: 06 12 18 42 44 55 67 94 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 26 Shellsort:grafische Darstellung mit Spalten 1 Sortierung Ausgangsfolge: fertig 44 55 12 42 94 18 06 67 06 06 4 Sortierung 18 12 44 55 12 42 44 18 06 42 12 18 94 18 06 67 94 55 12 67 42 42 44 44 55 55 94 67 67 94 2 Sortierung 44 18 06 42 06 18 12 42 94 55 44 55 12 67 94 67 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 27 Dreiband-Mischen Band 0 44 55 12 42 94 18 6 67 Zerlegen = Phase 1 Band 1 44 55 12 42 Band 2 94 18 6 67 Band 0 44 94 18 55 } Mischen = Phase 2 } ein Durchlauf 6 12 42 67 Zerlegen Band 1 Band 2 Band 0 44 94 18 55 6 12 42 67 6 12 44 94 } Mischen 18 42 55 67 usw Band 0 6 12 18 42 44 55 67 94 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren Abb. 41 c 28 Einphasen-Mischen (ausgeglichenes Mischen) Band 1 44 55 12 42 Band 2 94 18 6 67 Band 3 44 94 Band 4 18 55 42 67 6 12 Band 1 18 44 55 94 Band 2 6 12 42 67 Band 3 6 12 18 42 44 55 67 94 Band 4 leer 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren Abb. 41 d 29 Natürliches Mischen#1 Definition: Lauf: • innerhalb des Laufes gilt: a k <= a k+1 • am linken Ende eines Laufes gilt: a i-1 > a i • am rechten Ende eines Laufes gilt: a j > a j+1 a j a i-1 a k+1 a k a i a j+1 Lauf 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren Abb. 41 e 30 Natürliches Mischen#2 Vorgehensweise: 1. Teilfolgen von Band 0 auf Band 1 und 2 verteilen 2. entsprechende Teilfolgen von Band 1 und Band 2 mischen und auf Band 0 schreiben 3. dann mit 1 weiter, solange, bis auf Band 0 die sortierte Folge steht. a c a c Lauf 1 c c Lauf 2 b Verteilphase a Lauf n b b Mischphase 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren Abb. 41f c 31 Natürliches Mischen#3 Band0 17 31 5 59 13 41 43 67 11 23 29 47 3 7 71 verteilen Band1 17 31 13 41 43 67 Band2 5 59 11 23 29 47 3 7 71 mischen Band0 5 17 31 59 11 13 23 29 41 43 47 67 verteilen Band1 5 17 31 59 Band2 11 13 23 29 41 43 47 67 3 7 71 3 7 71 mischen Band0 5 11 13 17 23 29 31 41 43 47 59 67 3 7 71 verteilen / mischen … Band0 3 5 7 11 13 17 23 29 31 41 43 47 59 67 71 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 32 Mehrphasen-Mischen (Sortieren) Regeln: • ist die Anzahl der benötigten Bänder gleich n • es werden Laufe gemischt • ist ein Band erschöpft, so wird es zum neuen Zielband 2 3 ... n 11 10 4 ... 0 =Anzahl vorhandener Läufe je Band 7 6 0 ... 4 =Anzahl vorhandener Läufe je Band 3 2 4 ... 0 =Anzahl vorhandener Läufe je Band 1 0 2 ... 2 =Anzahl vorhandener Läufe je Band 0 1 1 ... Band 1 1 =Anzahl vorhandener Läufe je Band 1 0 0 0 =Anzahl vorhandener Läufe je Band 33 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren Abb. 41h Band 1 Anzahl Läufe 5 56 147 2 2 2 10 11 3 0 1 3 2 0 3 3 13 9 8 14 Leer (Zielband) 3 13 9 8 14 2 256 1 4 7 10 11 1 1 8 14 2 2 2 3 5 6 13 3 0 Leer (Zielband) 1 0 Leer (Zielband) 2 1 1 4 7 9 10 11 3 1 2 3 5 6 8 13 14 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Leer (Zielband) 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 1 4 7 9 10 11 34 Programm-Lauftzeit-Abschätzungen Problem: Mehrere Algorithmen zur Lösung einer Aufgabe verfügbar: was nehmen? Unser Programm: wozu? • Einmalig, Schnellschuß → einfachster Algorithmus • Einsatz in der Produktion, jahrelang, mit vielen Daten → Untersuchung der Alternativen Kriterien: • Einfachheit, Verständlichkeit, gute Dokumentation • benötigte Rechenzeit • benötigter Hauptspeicherplatz • benötigte Plattenzugriffe • benötigte Datentransfer im Netzwerk Möglichkeiten zur Bestimmung der Rechenzeit: 1. 2. Benchmarks Analyse 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 35 Benchmarks Idee: Zeitkritische Programmteile isolieren 90-10-Regel: 90% Laufzeit werden in 10% Programmcodes verbraucht Für die zeitkritischen Teile: • besonders schnelle Sprachen oder Techniken einsetzen • Laufzeitprofile ermitteln Extremfall: • Laufzeit des nicht-zeitkritischen Programmteils wird auf 0 gesetzt: vorher: 100% Zeit, nachher 100 – 10 = 90% • Laufzeit des zeitkritischen Programmteils wird halbiert: vorher: 100% Zeit, nachher 100- 90/2 = 55% 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 36 Analyse 2 Schritte: • Wahl einer Maßzahl. Bsp: n…Anzahl der zu sortierenden Zahlen • Bestimmung der Zeitfunktion T = T(n,t) Unterschiedliche Funktionen für unterschiedliche n: T(10,t) ≠ T(100,t) ≠ T(109,t) Interessant asymptotisches Verhalten (worst case): lim T (n, t ) n →∞ O-Funktionen = obere Schranke für Programm-Laufzeit Ziel: kleineste obere Schranke finden Aus der Mathe: • konstante multiplikative Faktoren sind unwichtig (dort stecken die Maschinen und Compilerdetails) • Terme niedriger Ordnung sind unwichtig. Bsp: • Transitivität Bsp: 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren O(2n + n3) = O(2n) f(n) = O(g(n)) ⇒ f(n) = O(h(n)) g(n) = O(h(n)) 37 Übliche Schranken • Konstante • logarithmisch • linear • n log n • quadratisch • kubisch • exponentiell O(1) O(log n) O(n) O(n log n) O(n2) O(n3) O(2n) 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 38 Anwendung auf Programmanweisungen #1 • for-Schleife for (i=0; i<n; i++) { // //n mal O(1) // Schleifenkörper: Inhalt unbekannt ⇒ O(f(n)) } 3 * O(1) + n*O(f(n)) = O(n*f(n)) • Verzweigung if (Boolscher Ausdruck) { // O(1) // if-Zweig: O(f(n)) } else { // else-Zweig: O(g(n)) } 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren O(max(f(n), g(n)) 39 Anwendung auf Programmanweisungen #2 • Block m { // Statements O(Block ) = ∑ O(Statementi ) i =1 } • while- und do-while-Schleife while(Bedindung) { // O(1) // Schleifenkörper: O(f(n)) } Worst case O(g(n)); O(g(n))*O(f(n)) = O (g(n)*f(n)) • Schleifenkörper f(n): wir wissen nicht, was im Körper steht • Worst case g(n): wir wissen nicht, wieviel mal die Schleife läuft 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 40 Beispiel 1 //Einheitsmatrix aufbauen for (i=0; i<n; i++) // for (j=0; j<n; j++) // a[i][j]=0; // for (i=0; i<n; i++) // a[i][i]=1; // n-mal n-mal O(1) O(n) n-mal O(1) O(n) T(n) = O(n2) + O(n) = O(n2) 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 41 O(n2) Beispiel 2 for (i=0; i<n-2; i++) { n-2 - mal small = i; // for (j=i+1;j<=n-1;j++)// n-i-1 - mal if (a[j]<a[small])// small = j; //O(1) max(O(1),0) temp = a[small]; // a[small] = a[i]; // a[i] = temp; // } O(1) O(n-i-1) =O(n) O(n) O(1) O(1) O(1) T(n) = (n-2)*O(n) = O(n2) - O(n) = O(n2) 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 42 Sortieraufwand#1 Voraussetzungen: 1. Wirtschaftlicher Einsatz des Speicherraumes 2. Zeitaufwand Zeitaufwand: Effizienz gegeben durch: C ... Anzahl der Schlüsselvergleiche (compare); C=f(n) M ... Anzahl der Elementumstellungen (move); M=g(n) (n...Anzahl der zu sortierenden Elemente) gute Methoden: schlechtere Methoden C = O(n log2(n)) C = O(n2) 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 43 Sortieraufwand#2 Cmin Insertionsort n-1 Cavrg (n2+n-2)/4 Selectionsort (n2+n)/2 Bubblesort (n2+n)/2 Cmax Mmin Mavrg (n2+n)/2-1 2(n-1) n2+9n-10 0 3(n2-n)/4 Heapsort Cmax + Mmax ~ n log2(n) Mergesort Cmax + Mmax ~ n log2(n) Quicksort Einphasen-Mischen (n2+3n-4)/4 3(n-1) n(ln(n)+0.57..) n2/4+3(n-1) C + M ~ n1.2) Shellsort Mmax n log2(n) C<<M 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren (log2(n))/6 n log2(n) 44 (n2-n)/2 Suchen 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 45 Sequentielle Suche 0 03 enthalten? 1 2 3 4 5 6 25 01 08 18 14 03 16 • z.B. von links suchen, solange - gefunden oder - Array-Ende erreicht (das gesuchte Element nicht enthalten) • die Elemente müssen nicht vorher sortiert werde 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 46 Binäre Suche 0 03 enthalten? 1 2 3 4 5 6 01 03 08 14 16 18 25 mitte = (elm[linkerRand}+elm[rechterRand])/2 • Prinzip: divide et impera • Die Zahlen müssen vorher sortiert werden Funktionsweise: - Die gesuchte Zahl < Mitte? => dann links von der Mitte suchen - Die gesuchte Zahl > Mitte? => dann rechts von der Mitte suchen - Die gesuchte Zahl = Mitte? => gefunden!!! Iterativ oder rekursiv weiter machen, bis 1-Element-Feld 1-Element-Feld geprüft und immer noch nicht gefunden? => => dann ist die Zahl nicht enthalten 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 47 0 Suche nach: Suche in Strings 1 2 3 4 str h u h u l j 0 im string: 1 2 3 4 5 6 7 a h u h u h u l muster i Funktionsweise: • i erhöht sich, sobald muster[i] = str[j] • dann werden beiden Zeiger i und j inkrementiert und die Übereinstimmung entsprechender Zeichen geprüft • Bei der ersten Ungleichheit: j=0, i geht zurück und zeigt auf den rechten Nachbar vom Zeichen, bei dem die Übereinstimmung began • Varianten: nach dem 1. Auftreten, nach allen Sunstrings suchen, etc. 2009 Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 48