MinSort
Aus ProgrammingWiki
Inhaltsverzeichnis |
Algorithmus
Bei einfachen rekursiven Problemlösungen haben wir Algorithmen implementiert, die der Suche des Minimums bzw. dem Streichen eines Elements in unverschachtelten numerischen Listen entsprechen. Daraus haben wir bereits einen ersten Sortieralgorithmus konstruiert:
Beschreibung:
- Suche aus der Liste das Minimum heraus,
- streiche es an seiner ursprünglichen Stelle und
- stelle es der Minimum-sortierten Restliste voran.
Da sich dieser Algorithmus am Minimum einer Liste orientiert, bezeichnen wir ihn als MinSort. Auf diese Weise sortieren Kartenspieler recht häufig ihre Spielkarten in der Hand.
Implementieren Sie den Algorithmus und testen Sie ihn an Listen mit Zufallszahlen $z$, mit $z \in \mathbb{Z}$.
Stellen Sie dazu die ungeordnete und die geordnete Zahlenliste jeweils in einem Balkendiagramm grafisch dar.
Quelltext überprüfen:
Ungeordnete Zufallszahlen: |
Geordnete Zufallszahlen: |
Hinweis: Um mehrere Zeichenflächen nutzen zu können, muss die Prozedur balkendiagramm mit einem zusätzlichen Parameter ausgestattet werden, der einer fortlaufenden Nummerierung entspricht:
(balkendiagramm <ls> ; Liste mit Zahlenwerten <nr>) ; fortlaufende Nummerierung des Balkendiagramms
Effizienz von MinSort
Theoretische Analyse des Zeitaufwands
Wir überlegen uns zunächst, wie viele Vergleiche bei der Minimumsuche insgesamt durchgeführt werden:
Das Schema lässt sich mit einer Dreieckfläche vergleichen. Damit sind also $\tfrac{n}{2} (n-1)$ Vergleiche zum Auffinden des Minimums notwendig.
Zum Streichen des gefundenen Minimums sind ähnliche Überlegungen möglich.
Im Mittel kann man aber davon ausgehen, dass das Streichen nach $\tfrac{n}{2}$ Vergleichen pro Durchlauf abgeschlossen ist (endständig rekursive Prozedur).
Damit ist folgende Abschätzung für den Gesamtaufwand möglich:
$T(n) = \underbrace{\frac{n}{2} \cdot (n-1)}_{Min-Suche} + \underbrace{\frac{1}{2} \cdot \frac{n}{2} \cdot (n-1)}_{Streichen} = \frac{3}{4} \cdot n \cdot (n-1)$
$T(n) \approx \frac{3}{4} \cdot n^2$ bzw.
$T(n) = \mathcal{O}(n^2)$
Das Minimum-Sortieren erfolgt mit quadratischem Zeitaufwand.
Experimente zum Zeitaufwand
Wir wollen unsere theoretische Analyse empirisch bestätigen. Dazu definieren wir unseren MinSort-Algorithmus mit einem "eingebauten" (Zeittakt-)Zähler:
Im Weiteren wollen wir uns wieder nur auf die Zählergebnisse unseres "Zeittaktmessers" konzentrieren.
Dazu sollen die Wiederholungen des Experimentes automatisiert werden:
Schließlich sollen die Ergebnisse unserer empirischen Untersuchung wieder im Balkendiagramm visualisiert werden.
Achtung! Mit kleinen Wiederholraten und etwas Geduld experimentieren!
Die empirischen Untersuchungen bestätigen den quadratischen Zeitaufwand von MinSort.
Aufgaben
-
Ermitteln Sie mit der Prozedur minsort-mehrfach empirisch die Zeitaufwandsfunktion
$T:\mathbb{N} \rightarrow \mathbb{R}^+$.
Nutzen Sie dazu eine Tabellenkalkulation oder den grafikfähigen Taschenrechner. Bestimmen Sie die Funktionsgleichung $T(n) = f(n)$ durch quadratische Regression und vergleichen Sie diese mit den oben angeführten theoretischen Überlegungen. -
Implementieren Sie unter DrScheme den MinSort-Algorithmus zum lexikografischen Ordnen von Zeichenketten.
Dabei soll wahlweise aufsteigend oder absteigend geordnet werden können (Prozeduren höherer Ordnung!).
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.
- Stehen sie in der richtigen Reihenfolge gehe ein Schritt nach rechts.
- 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 ein Schritt nach rechts. - Wiederhole das Sortieren bis zum letzten Blumentopf.
Implementieren Sie diesen Algorithmus und untersuchen Sie seine Effizienz im average- best- und worst-case-Fall.
Zur Problemlösung.