21.11.2013 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!