Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
23 Sortieren<br />
<strong>E<strong>in</strong>e</strong>r der am häufigsten gebrauchten Algorithmen ist das Sortieren. Überlegen Sie sich als e<strong>in</strong>leitendes<br />
Beispiel kurz wie Sie das folgende Array mit 5 Zahlen <strong>in</strong> aufsteigender Reihenfolge sortieren<br />
würden (Als Anweisungsfolge an e<strong>in</strong>e Person):<br />
<strong>in</strong>t Werte[5] = {9, 17, 3, 21, 5};<br />
Es gibt sehr viele verschiedene bekannte Sortierverfahren, <strong>die</strong> sich durch Effizienz <strong>und</strong> Kompliziertheit<br />
vone<strong>in</strong>ander unterscheiden. Die am e<strong>in</strong>fachsten zu verstehenden Verfahren s<strong>in</strong>d im allgeme<strong>in</strong>en<br />
auch <strong>die</strong> am wenigsten effizienten. E<strong>in</strong>ige bekannte Verfahren s<strong>in</strong>d <strong>in</strong> der folgenden Tabelle<br />
aufgeführt (Siehe 'The Art of Computerprogramm<strong>in</strong>g', Donald E.. Knuth, Addsion Wesley):<br />
Name Implementation Laufzeit Speicher<br />
Durchschnitt Maximal bedarf<br />
Bubblesort E<strong>in</strong>fach 5.75N 2 +N*ln(N) 7.5N 2 N+1<br />
Straight <strong>in</strong>sertion E<strong>in</strong>fach 1.5N 2 +9.5N 3N 2 N+1<br />
Straight Selection E<strong>in</strong>fach 2.5N 2 +3N*ln(N) 3.25N 2 N<br />
Quicksort Komplex 11.6N*ln(N)-1.7N >=2N 2 N + ln*(N)<br />
Heapsort Komplex 23.N*ln(N) 24.5N*ln(N) N<br />
Listmerge Komplex 14.4N*ln(N)+4.9N 14.4N*ln(N) N<br />
N: Anzahl der zu sortierenden Elemente<br />
ln(): Logarithmus.<br />
Quicksort gilt allgeme<strong>in</strong> als e<strong>in</strong>er der am universellsten e<strong>in</strong>setzbaren Algorithmen. Wenn das Feld<br />
allerd<strong>in</strong>gs bereits sortiert ist, kann Quicksort sehr langsam werden. Je nach Anwendungsfall gibt es<br />
jeweils e<strong>in</strong>en optimalen Algorithmus, <strong>die</strong>s kann von den Daten, der Hardware <strong>und</strong> vom verfügbaren<br />
Speicherplatz abhängen.<br />
Für Spezialfälle (Fast sortiertes Feld, <strong>in</strong> umgekehrter Reihenfolge sortiertes Feld) können <strong>die</strong> Algorithmen<br />
bei Bedarf oft optimiert werden.<br />
Wir werden hier Bubblesort, Straight Insertion, Straight Selection, Quicksort <strong>und</strong> Listmerge<br />
näher betrachten:<br />
Bei allen Algorithmen werden wir <strong>in</strong> aufsteigender Reihenfolge sortieren. Selbstverständlich können<br />
<strong>die</strong>se Algorithmen durch entsprechende Modifikation auch <strong>in</strong> <strong>die</strong> andere Richtung sortieren.<br />
Bei e<strong>in</strong>em Sortieralgorithmus spricht man von e<strong>in</strong>em stabilen Sortieren, wenn e<strong>in</strong>e bereits existierende<br />
Ordnung soweit möglich erhalten bleibt, von e<strong>in</strong>em <strong>in</strong>stabilen Sortieren, wenn e<strong>in</strong>e bereits<br />
bestehende Ordnung verloren geht. Wenn zum Beispiel e<strong>in</strong>e Adresskartei mit e<strong>in</strong>em stabilen Sortieralgorithmus<br />
zuerst nach Vornamen, dann nach Nachnamen sortiert wird, bleibt <strong>die</strong> Sortierung<br />
nach Vornamen bei E<strong>in</strong>trägen mit gleichem Nachnamen bestehen, bei e<strong>in</strong>em Instabilen nicht.<br />
Man spricht von <strong>in</strong>ternem Sortieren, wenn sich der ganze Datenbestand wärend des sortierens im<br />
Hauptspeicher bef<strong>in</strong>det, <strong>und</strong> von externem Sortieren, wenn <strong>die</strong> Daten auf H<strong>in</strong>tergr<strong>und</strong>speichern<br />
(Harddisk, Magnetband, …) verbleiben <strong>und</strong> nur Teile davon <strong>in</strong> den Hauptspeicher geladen werden.<br />
(Weil z.B. <strong>die</strong> Datenmenge im Hauptspeicher schlicht ke<strong>in</strong>en Platz hat).<br />
Bei grossen Datensätzen empfiehlt es sich, anstelle des Datenarrays e<strong>in</strong> Array mit Zeigern auf <strong>die</strong><br />
Daten zu sortieren, so müssen während des Sortiervorganges nicht <strong>die</strong> Datansätze selbst, sondern<br />
nur <strong>die</strong> Zeiger im Zeigerarray bewegt werden, <strong>die</strong>s ist deutlich effizienter. Anschliessend können<br />
<strong>die</strong> Datensätze (Falls überhaupt notwendig) entsprechend dem Zeigerarray angeordnet werden.<br />
Gedruckt am 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 88/147