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 ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<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.5 Listmerge / Mergesort:<br />
Mergesort ist ebenfalls e<strong>in</strong> sehr effizienter Sortieralgorithmus, er braucht aber zusätzlichen Hilfsspeicher<br />
beim Mischen (Merge) der Daten. Beim Sortieren von Listen wird ke<strong>in</strong> zusätzlicher Speicher<br />
benötigt, deshalb ist <strong>die</strong>ser Algorithmus für Listen sehr gut geeignet.<br />
Dieses Verfahren beruht auf dem Pr<strong>in</strong>zip, zwei bereits sortierte Felder oder Listen zu e<strong>in</strong>em neuen,<br />
sortierten Feld zusammenzufügen. Dabei beg<strong>in</strong>nt man mit vielen Feldern oder Listen der Länge e<strong>in</strong>s<br />
<strong>und</strong> wendet das Verfahren wiederholt auf <strong>die</strong> resultierenden Teilfelder an, bis nur noch e<strong>in</strong> Feld<br />
übrig ist, welches dafür alle Werte <strong>in</strong> sortierter Folge enthält.<br />
Beim Zusammenfügen werden jeweils <strong>die</strong> vordersten Elemente beider Listen mite<strong>in</strong>ander verglichen,<br />
<strong>und</strong> das kle<strong>in</strong>ere der beiden entfernt <strong>und</strong> ans Ende der neuen Liste angehängt. Das wird solange<br />
wiederholt, bis beide Ursprungslisten leer s<strong>in</strong>d, <strong>und</strong> somit alle Elemente sortiert <strong>in</strong> der neuen<br />
Liste s<strong>in</strong>d.<br />
Anschliessend werden <strong>die</strong> so gewonnenen neuen Listen wieder zusammengefügt, <strong>und</strong> das ganze<br />
wiederholt, bis nur noch e<strong>in</strong>e Liste übrig ist.<br />
Orig<strong>in</strong>alfeld:<br />
In 16 Listen<br />
a 1 Element<br />
aufgeteilt:<br />
8 1 12 13 2 16 15 7 9 13 6 3 14 10 4 5<br />
8 1 12 13 2 16 15 7 9 13 6 3<br />
…<br />
Zu 8 Listen<br />
a 2 Elemente<br />
zusammengefügt<br />
1 8 12 13 2 16 7 15 9 13 3 6 10 14<br />
…<br />
Zu 4 Listen<br />
a 4 Elemente<br />
zusammengefügt<br />
1 8 12 13 2 7 15 16 3 6 9 13 4 5 10 14<br />
Zu 2 Listen<br />
a 8 Elemente<br />
zusammengefügt<br />
1 2 7 8 12 13 15 16 3 4 5 6 9 10 13 14<br />
Zu 1 Liste<br />
a 16 Elemente<br />
zusammengefügt<br />
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16<br />
In jedem Teilschritt wird so <strong>die</strong> Anzahl der Listen halbiert <strong>und</strong> <strong>die</strong> Länge der Teillisten verdoppelt.<br />
Somit endet der Algorithmus nach log2(N) Teilschritten. In jedem Schritt müssen N/k Listen mit k<br />
Elementen zu N/(2*k) Listen mit 2*k Elementen komb<strong>in</strong>iert werden. Dazu müssen Pro neue Liste<br />
2*k-1 Vergleiche durchgeführt werden, also pro Teilschritt N/(2*k)*(2*k-1) Vergleiche. Somit<br />
werden für den ganzen Vorgang ungefähr log2(N)*N Vergleiche benötigt.<br />
Listmerge lässt sich sehr e<strong>in</strong>fach mittels Rekursion implementieren. Es lässt sich problemlos stabil<br />
(Beibehaltung e<strong>in</strong>er ursprünglichen Ordnung) implementieren.<br />
Gedruckt am 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 93/147