BubbleSort
Aus ProgrammingWiki
Inhaltsverzeichnis |
Voraussetzungen
Mit der Datenstruktur Feld haben wir bereits eine große Anzahl von Zufallszahlen generiert und ausgegeben.
Dazu wurde die Funkion zufallszahl implementiert:
Weiterhin halten wir die bekannten Funktionen zum Erzeugen bzw. Ausgeben eines zufälligen Datenfeldes bereit:
function erzeugen(von, bis, anz) function ausgabe(feld)
Wir testen zunächst die Generierung und Ausgabe eines umfangreichen Datenfeldes mit Zufallszahlen:
Modifizierte Maximumsuche
Zunächst wollen wir die sequenzielle Suche nach dem größten Feldelement eines numerischen Datenfeldes modifizieren.
Wir benutzen dazu den folgenden Algorithmus:
- Vergleiche die beiden ersten Feldelemente.
- Steht das größere Element vor dem kleineren, so vertausche die Positionen beider Elemente.
- Verfahre derart mit allen weiteren benachbarten Feldelementen.
- Gib das letzte Feldelement zurück - es ist das größte Element des Datenfeldes.
Implementiere diesen Algorithmus.
Quelltext überprüfen:
BubbleSort-Algorithmus
Wir stellen uns nun vor, dass unser Datenfeld der modifizierten Maximumsuche unterzogen und anschließend das letzte Feldelement gedanklich abgetrennt wird. Eine erneute Anwendung der Maximumsuche auf das Restfeld führt dazu, dass das zweitgrößte Element an vorletzter Stelle steht.
Wir erkennen: Die Mehrfachanwendung der modifizierten Maximumsuche auf ein Datenfeld, dessen größter Feldindex schrittweise dekrementiert (zurükgesetzt) wird, führt zum Sortieren des gesamten Datenfeldes.
Jedes Teil-Maximum rückt dabei schrittweise, ähnlich einer Luftblase, die in einem Sumpf aufsteigt, an seine korrekte Stelle. Wir nennen deshalb diesen Sotieralgorithmus BubbleSort.
Quelltext überprüfen:
Ungeordnete Zufallszahlen: |
Geordnete Zufallszahlen: |
Aufwandsbetrachtungen
Empirische Untersuchungen
Wie wirken sich große Datenmengen auf die Dauer des Sotiervorgangs aus?
Wir wollen den sogenannten Zeitaufwand des BubbleSort-Algorithmus untersuchen. Dazu soll stark vereinfacht angenommen werden, dass jeder Vergleich zweier benachbarter Feldelemente sowie der mögliche Tausch dieser Feldelemente je einem Zeittakt entsprechen.
Diese Zeittakte sollen in Abhängigkeit der Anzahl der zu sortierenden Feldelemente ermittelt werden.
Wegen der beträchlichen Streuung der Zählergebnisse soll der Mittelwert aus Mehrfachanwendungen der Funktion sortAufwand ermittelt werden. Vervollständige die entsprechende Funktion.
Theoretische Untersuchungen
Wir überlegen uns zunächst, wie viele Vergleiche der Feldelemente insgesamt durchgeführt werden:
Das Schema lässt sich mit einer Dreieckfläche vergleichen. Damit sind also $\tfrac{n}{2} (n-1)$ Vergleiche notwendig.
Zum Tauschen der Feldelemente sind ähnliche Überlegungen möglich. Im Mittel kann man aber davon ausgehen, dass das Tauschen nur bei der Hälfte aller Vergleiche notwendig ist.
Damit ist folgende Abschätzung für den Gesamtaufwand $T(n)$ möglich:
$T(n) = \underbrace{\frac{n}{2} \cdot (n-1)}_{Vergleiche} + \underbrace{\frac{1}{2} \cdot \frac{n}{2} \cdot (n-1)}_{Vertauschungen} = \frac{3}{4} \cdot n \cdot (n-1)$
$T(n) \approx \frac{3}{4} \cdot n^2$ bzw.
$T(n) \sim n^2$
Das Sortieren mit dem BubbleSort-Algorithmus erfolgt mit quadratischem Zeitaufwand.
Grafische Auswertung
Um unsere theoretischen Betrachtungen zu bestätigen, wollen wir die empirischen Ergebnise visualisieren.
Zum Weiterarbeiten
GnomeSort
In einem Garten sind Blumentöpfe in einer Reihe aufgestellt. Gartenzwerge sollen sie nun der Größe nach aufsteigend sortieren. Sie benutzen dazu den folgenden Algorithmus:
- Beginne links und vergleiche die beiden ersten Töpfe.
- Wenn sie nicht in der korrekten Reihenfolge stehen, vertausche die beiden Töpfe und gehe einen Schritt nach links. Ist der Schritt nach links nicht möglich, gehe einen Schritt nach rechts.
- Gehe auch in jedem anderen Fall einen Schritt nach rechts.
- Wiederhole diesen Vergleich benachbarter Töpfe bis zum letzten Blumentopf.
Implementieren diesen Algorithmus.
Zur Problemlösung.