Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:algorithmen:sortieren:bubblesort [20.02.2020 15:09] – [Aufwandsmessungen] sbel | faecher:informatik:oberstufe:algorithmen:sortieren:bubblesort [26.01.2022 18:05] (aktuell) – gelöscht sbel | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Bubble Sort ====== | ||
- | Oje, Willi hat seine Mistkugeln auf offenem Feld aufgereiht. Ein heftiger | ||
- | Windstoss und die Kugeln rollen davon und liegen schon wieder in einem | ||
- | Durcheinander. Also nochmals sortieren. Willi ist noch ganz erschöpft von | ||
- | seiner ersten Sortier-Aktion. Vor allem das Suchen der " | ||
- | war sehr anstrengend! Er musste dabei immer die ganze Kugelreihe | ||
- | überblicken. | ||
- | |||
- | Gut, ich machs nochmals, sagt er sich, aber diesmal ein | ||
- | bisschen systematischer. Er sucht die " | ||
- | nach dem Zufallsprinzip, | ||
- | vergleicht er immer zwei benachbarte Kugeln. Sobald er zwei Kugeln mit falscher | ||
- | Reihenfolge gefunden hat, vertauscht er diese. Nachdem er die ganze Reihe so abgearbeitet | ||
- | hat, beginnt er wieder vorn vorne, d.h. von links. Wenn es schon mit Zufall geklappt hat, denkt | ||
- | sich Willi, dann muss es doch mit System erst recht klappen. Vielleicht sogar noch schneller | ||
- | als vorher? Tatsächlich findet er nach einigen Durchgängen kein " | ||
- | |||
- | ===== Schritt für Schritt... ===== | ||
- | |||
- | |||
- | | **Erster Durchlauf: | ||
- | |**Zweiter Durchlauf: | ||
- | | **Dritter Durchlauf: | ||
- | |||
- | |||
- | Bei einem vierten Durchlauf würde man keine Vertauschung mehr benötigen - die Mistkugeln sind sortiert. | ||
- | |||
- | |||
- | <note tip>Wenn man sich anstelle der Mistkugeln Luftblasen in einem Aquarium vorstellt und das | ||
- | Ganze um 90° gegen den Uhrzeigersinn dreht, sieht man in Gedanken, wie die Luftblasen im | ||
- | Wasser aufsteigen. Zuerst die grösste ganz nach oben, dann die zweitgrösste usw. Die | ||
- | Vorstellung von den steigenden Luftblasen hat diesem Sortierverfahren seinen Namen | ||
- | gegeben: **BubbleSort** (bubble (engl.) = Blase).</ | ||
- | |||
- | {{.: | ||
- | |||
- | {{ .: | ||
- | |||
- | Beobachte die Postion der jeweils größten Kugeln, die noch nicht an ihrem endgültigen Platz sind - was fällt dir auf? | ||
- | |||
- | ===== Der Algorithmus ===== | ||
- | |||
- | Wir sehen im Beispiel oben sofort, dass die Reihe nach dem dritten Durchgang sortiert | ||
- | ist und wir damit fertig sind. Wie aber kann ein Programm herausfinden, | ||
- | sortiert ist? Um zu entscheiden, | ||
- | mehr gefunden wird, sind wir fertig. | ||
- | |||
- | Diese Überlegungen führen uns auf folgenden Algorithmus: | ||
- | |||
- | ^Schritt ^ Was ist zu tun? ^ | ||
- | |(1) |Wähle die ersten beiden Elemente von links.| | ||
- | |(2) |Ist beim gewählten Paar das linke Element grösser als das rechte? Wenn ja, vertausche die beiden.| | ||
- | |(3) |Hat es rechts des soeben untersuchten Paares noch weitere Kugeln? Wenn ja, wähle das nächste Paar benachbarter Elemente und gehe zu (2). | | ||
- | |(4) |Wir haben einen Durchgang beendet. Wurde in diesem Durchgang mindestens ein " | ||
- | |||
- | ===== Anwendung des Algorithmus auf das Eingangsbeispiel ===== | ||
- | {{ .: | ||
- | {{.: | ||
- | |||
- | * Schreibe Stichwortartig in die Felder, welchen Schritt des Algorithmus man ausführt und was genau dabei gemacht wird. | ||
- | * Notiere die Zahlenreihe und markiere bei jedem Schritt, welche Zahlen dort betrachtet werden. | ||
- | |||
- | |||
- | Warum sind vier Durchläufe nötig? Erkläre! | ||
- | |||
- | ===== Implementation des Algorithmus ===== | ||
- | |||
- | {{.: | ||
- | |||
- | * Die einfachste Variante ist dabei voll lauffähig, du kannst also auf jeden Fall damit beginnen, den Algorithmus mit dem Programm bubblesort_easy.php im Browser zu testen. | ||
- | * Versuche dann, die Vorlage in bubblesort_medium.php lauffähig zu machen. Wenn das nicht klappt, bearbeite die Aufgaben in der Datei bubblesort_easy.php, | ||
- | |||
- | {{.: | ||
- | |||
- | - " | ||
- | - " | ||
- | - " | ||
- | |||
- | ersetzt? Ändere das Programm jeweils entsprechend ab und überprüfe das Ergebnis deiner Überlegungen. | ||
- | |||
- | ===== Optimierungen ===== | ||
- | |||
- | ==== Erste Optimierung ==== | ||
- | |||
- | {{.: | ||
- | |||
- | Bei einem Array der Grösse n werden also in den ersten n-1 Durchgängen die n-1 grössten | ||
- | Elemente (das sind alle ausser das kleinste) an ihren endgültigen Platz gebracht. Wenn aber | ||
- | alle Elemente bis auf das kleinste am richtigen Platz sind, dann muss zwangsläufig das | ||
- | kleinste auch schon am richtigen Platz sein, nämlich ganz links. Eine andere Möglichkeit gibt | ||
- | es nicht! | ||
- | |||
- | Mit anderen Worten: Bei einem Array der Grösse n wird im n-ten Durchgang sicher nichts | ||
- | mehr vertauscht. Es sind also höchstens n-1 Durchgänge nötig. Man kann auch direkt eine | ||
- | feste Zahl von n-1 Durchgängen ausführen. Dadurch erspart man sich die Abfrage, ob in | ||
- | einem Durchgang etwas vertauscht wurde. | ||
- | |||
- | {{.: | ||
- | |||
- | Was ist ein möglicher Nachteil, wenn wir eine fixe Anzahl (nämlich n-1) Durchgänge | ||
- | ausführen? | ||
- | |||
- | |||
- | ==== Zweite Optimierung ==== | ||
- | |||
- | Nach dem ersten Durchgang steht das grösste Element ganz rechts. Nach dem zweiten | ||
- | Durchgang steht das zweitgrösste Element an zweiter Stelle von rechts. Nach i Durchgängen | ||
- | steht das i-t-grösste Element an der i-ten Stelle von rechts, und die i Elemente rechts sind | ||
- | sortiert. Es muss also nicht jedes Mal der ganze Array durchlaufen werden, sondern im i-ten | ||
- | Durchgang nur die ersten (n-i+1) Elemente. | ||
- | |||
- | {{.: | ||
- | |||
- | Bearbeite anschließend die funktionierende Version des optimierten Bubbsort-Programms aus der vorigen Aufgabe ('' | ||
- | |||
- | ===== Aufwandsmessungen ===== | ||
- | |||
- | Um den Zeitaufwand bzw. die " | ||
- | verschiedene Möglichkeiten denkbar: Man könnte zum Beispiel die Laufzeit in Sekunden | ||
- | messen. Dies wäre allerdings abhängig von der verwendeten Maschine und möglicherweise | ||
- | auch von anderen, gleichzeitig laufenden Programmen. | ||
- | |||
- | Wir wollen den Aufwand unserer Verfahren messen, indem wir zwei Grössen bestimmen: Die | ||
- | **Anzahl Vergleiche** und die **Anzahl Vertauschungen** von Array-Elementen. Sämtliche hier | ||
- | behandelten Verfahren basieren nämlich ausschliesslich auf diesen beiden Operationen. Den | ||
- | übrigen Aufwand, z.B. für die Ablaufsteuerung von Schleifen, ignorieren wir grosszügig. | ||
- | |||
- | Verwende als Basis für die folgenden Aufgaben bitte die Datei {{bubblesort_zufallsarray.php.zip|}}. Dabei handelt es sich um ein nicht optimiertes Bubblesortverfahren, | ||
- | |||
- | * '' | ||
- | * '' | ||
- | |||
- | {{.: | ||
- | |||
- | <code php> | ||
- | // Erzeugt ein Array der Länge $laenge mit | ||
- | // Zufallszahlen zwischen 1 und 1000 | ||
- | for($i=0; | ||
- | $zufallszahl = rand(1, | ||
- | $das_array[] = $zufallszahl; | ||
- | } | ||
- | </ | ||
- | |||
- | {{.: | ||
- | |||
- | Kannst du einen Zusammenhang zwischen der Arraygröße **n** und den erforderlichen Operationen erkennen? | ||
- | |||
- | Weiter zu [[selectionsort|SelectionSort]]. |