Sortierverfahren

Aus ProgrammingWiki
Archivierte Version vom 2012-09-11T20:30:29+00:00. Aktuelle Version

Inhaltsverzeichnis

Vorbemerkungen


Zunächst begeben wir uns mal vor die Tür :-)

Das Sortieren (und Suchen) ist in der Informatik umfassend untersucht worden, weil Sortieralgorithmen in zahlreichen Anwendungen verwendet werden
(Datenbanken, Compiler, Betriebssysteme etc.).

Grundsätzlich gibt es drei Methoden zum Sortieren:

  • Auswählen
  • Einfügen
  • Austauschen


Wir besprechen diese Verfahren an Hand des Sortierens von Spielkarten: Beim Auswählen breitet man die Karten auf dem Tisch aus und wählt die niedrigste Karte. Anschließend wird die nächste Karte gewählt und hinter die niedrigste gereiht, usw. Beim Sortieren durch Einfügen hält man die Karten in der Hand, nimmt jeweils die nächste und fügt sie in einen am Tisch liegenden Stapel so ein, dass sie jeweils an der richtigen Stelle zu liegen kommt. Die Karten sind sortiert, sobald man keine Karte mehr in der Hand hält. Um die Karten durch Austauschen zu sortieren, breitet man die Karten in beliebiger Reihenfolge auf dem Tisch aus und tauscht dann die falsch liegenden Karten solange aus, bis der Satz geordnet ist.

Für die "Güte" eines Sortieralgorithmus sind folgende Kriterien ausschlaggebend:

  1.	Wie schnell sortiert der Algorithmus durchschnittlich Informationen? 
  2.	Wie schnell ist er im günstigsten und ungünstigsten Fall? 
  3.	Verhält sich der Algorithmus natürlich (d.h. hat er bei gut sortierten Listen 
        wenig und bei ziemlich ungeordneten Listen viel zu tun)? 
  4.	Ordnet er Elemente mit gleichen Schlüsseln um? 

Sortieralgorithmen bieten sich als grundlegendes Thema für die Analyse von Algorithmen an.


Sortieren durch Auswählen (Minimumsuche)

Die Idee einer der einfachsten Sortieralgorithmen ist die folgende: Finde zunächst das kleinste Element im Datenfeld und tausche dieses gegen das an der ersten Stelle befindliche Element aus. Anschließend finde das zweitkleinste Element, tausche es gegen das zweite Element aus ... usw.

Diese Sortiermethode ist für kleine Dateien sehr gut brauchbar. Zu beachten ist, dass jedes Element tatsächlich nur einmal getauscht wird.


       Prinzip: Aus einer Menge wird das kleinste Elelment ausgewählt und mit dem ersten Element vertauscht.
       Diese Vorgänge werden wiederholt ,wobei die Anzahl der Elemente bei jeder Wiederholung von vorn um eins verringert wird.
       Zuletzt werden nur noch zwei Elemente überprüft und gegebenenfalls vertauscht.


 
Auswaehlen2.JPG unsortiertes Feld





36 mit 99 vertauscht,

anschließend kleinstes Element
des Restfeldes (roter Pfeil) mit 99 vertauscht







77 mit 99 vertauscht, anschließend kleinstes Element
des Restfeldes mit 99 vertauscht...

Auswaehlen4.JPG


Implementiert könnte dies so aussehen:


<eval id="4c1b17ab54d27"> var z:array[0..7] of integer; var i,j,k,h:integer; begin for i:=0 to 7 do begin z[i]:=random(20)+1; write(inttostr(z[i])+' '); end; for i:=0 to 7 do begin </eval>

k:=i;  
for j:=i to 7 do  
if z[j]<z then k:="j;" h:="z[i];" z><p>end;
writeln(<em>);
writeln(</em>);
for i:=0 to 7 do write(inttostr(z[i])+' ');
end.
</p><p><br></p><h2 id="Sortieren_durch_Einfügen">Sortieren durch Einfügen</h2><p><br></p><pre>       <b>Prinzip: Man wählt ein Element (nacheinander vom zweiten bis zum letzten) und fügt es jeweils an die richtige 
       Stelle der davorstehenden geordneten Teilmenge ein. </b></pre><p><br></p><table border="1" cellpadding="5" cellspacing="2">
<pre><tr>
 <td>Einfuegen2.JPG</td>
 <td>unsortiertes Feld; zweites Element herausgenommen und <br>vor dem Ersten eingefügt<p><br><br><br><br><br>sechstes Element genommen und als viertes eingefügt,<br>
dabei werden viertes und fünftes (alt) neues<br> fünftes und sechstes Element
<br><br><br><br><br><br>
Letztes Element an die richtige Stelle,
Feld vollständig sortiert</p><p><br></p></td>
<pre> <td>Einfuegen4.JPG</td>
</pre></tr></pre></table>
<p><br></p><p>Implementieren Sie das <em>Sortieren durch Einfügen</em> analog zum Sortieren durch Auswählen!</p><p><eval id="4c1b265b1e11e"></eval></p><p></p><h2 id="Sortieren_durch_Austauschen_(Bubblesort)">Sortieren durch Austauschen (Bubblesort)</h2><p>Dieses Sortierverfahren wird häufig erklärt, obwohl es wahrscheinlich das ungünstigste Sortierverfahren darstellt, das jemals realisiert worden ist: Durchlaufe immer wieder das
Feld und vertausche jedesmal, wenn es notwendig ist, benachbarte Elemente. Die Datei ist sortiert, wenn kein Austausch mehr notwendig ist. 
Der Algorithmus erhält seinen Namen von der Tatsache, dass die Elemente - ähnlich wie Blasen im einem Glas Mineralwasser - aufsteigen, bis sie an der richtigen Stelle sind. </p><p><br></p><pre>       <b>Prinzip: Vom letzten Element einer Menge an werden jeweils zwei benachbarte Elemente verglichen und ausgetauscht, wenn
       sie falsch sortiert sein sollten. Dabei wandert da kleinste Element an die erste Stelle.
       Das Vergleichen und Austauschen wird mit Ausnahme dieses bereits richtig postierten Elements wiederholt.
       Das Sortieren kann aufsteigend (links nach rechts) oder absteigend (umgekehrt) erfolgen.</b></pre><p><br></p><table border="1" cellpadding="5" cellspacing="2">
<pre><tr>
 <td>Austauschen2.JPG</td>
 <td><br><br>unsortiertes Ausgangsfeld,<br><br><p>die 83 ist falsch sortiert und wird bis zum Feldindex,<br> der einen Wert größer als 83 enthält, verschoben,
anschließend wird<br> die 97 und die 32 vertauscht, wonach die 97 als größte Zahl des<br> Feldes als erste an der richtigen Stelle steht.<br><br>Das Vergleichen beginnt wiederum von vorn, wobei die Zahlen<br> 64 und 41 sowie 90 und 32 vertauscht werden.<br>
Die 90 steht damit als zweite Zahl an der richtigen Stelle.
<br><br><br>
Anschließend wird die 32 nach links durchgereicht<br> und das Feld ist vollständig sortiert.</p></td>
<pre> <td>Austauschen4.JPG</td>
</pre></tr></pre></table>
<p><br></p><p>Implementieren Sie <em>Bubblesort</em> analog zum Sortieren durch Auswählen!</p><p><eval id="4c1f0917ac95b"></eval></p><p></p><p><br></p><h2 id="Quicksort">Quicksort</h2><p>Das Sortieren durch Minimumsuche (<em>MinSort</em>) ist nicht sehr effizient.<br>
Wir betrachten deshalb den nachfolgenden Algorithmus und implementieren ihn.</p><p><strong>Beschreibung:</strong></p><ul><li>Benutze das erste Element einer (numerischen) Liste als Trennelement.</li><li>Erzeuge zwei Teillisten, deren Elemente kleiner bzw. größer als das Trennelement sind.</li><li>Setze dieses Verfahren für jede nichtleere Teilliste fort und</li><li>füge die sortierten Teillisten zur Gesamtliste zusammen.</li></ul><p><br></p><p>Den so beschriebenen Sortieralgorithmus bezeichnet man als <em>QuickSort</em> (schnelles Sortieren). Er wurde 1962 von dem britischen Informatiker Sir <strong>Charles Antony Richard Hoare</strong> (* 11. Januar 1934) vorgestellt.</p><p><br></p><table border="1"><tr><td><strong>Prinzip</strong></td><td><strong>Quelltext</strong> in Pascal</td><td></td><td></td></tr><tr><td>QuickSort-Beispiel1.gif</td><td>Quicksort_2.JPG</td><td>
Hoare.jpg
C.A.R. Hoare
</td></tr></table><p><br></p> <p><br></p><p>Der Algorithmus arbeitet nach dem Prinzip <strong><em>Teile und Herrsche</em></strong>.<br> weitere Informationen unter: http://www.inf.fh-flensburg.de/lang/algorithmen/sortieren/quick/quick.htm</p><h2 id="Literatur">Literatur</h2><ul><li>Fahldieck, Karl-Heinz: Algorithmen, Frankfurt am Main: Verlag Moritz Diesterweg, 1993</li><li>Sedgewick, Robert: Algorithmen, Bonn:Addison-Wesley Publishing Company, 1992</li><li>Hermann, Dietmar: Algorithmen Arbeitsbuch, Bonn; München; Paris, Addison-Wesley Publishing Company, 1992</li><li>Junger, Hans u.a.: Informatik, Frankfurt am Main; Aarau, Verlag Moritz Diesterweg; Verlag Sauerländer AG, 1988</li></ul></z>