Mergesort
description
Transcript of Mergesort
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Mergesort
Divide and Conquer
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Gliederung
1. Allgmeine Informationen
2. Funktionsweise
3. Der Algorithmus
4. Implementierung
5. Vor- und Nachteile
6. Vergleich mit Insertionsort
7. Quellen
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Allgemeine Informationen
1945 von John von Neumann vorgestellt rekursiv funktioniert nach dem Prinzip „Teile und
herrsche“
betrachtet zu sortierende Daten als Liste teilt Daten in kleinere Listen und sortiert diese Teillisten werden wieder zusammengeführt
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Funktionsweise
Listen werden so weit wie möglich geteilt paarweise Vermischung der Teile
größere, sortierte Teillisten entstehen
Teillisten werden nacheinander zu einer Liste kombiniert sortierte Gesamtliste
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Der Algorithmus
bestehend aus rekursiver Funktion mergesort() und Mischfunktion merge()
mergeSort(int[] liste, int links, int rechts): rekursiv Aufruf von merge()
merge(int[] listeA, int[] listeB, int links, int mitte, int rechts):
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Der Algorithmus
bestehend aus rekursiver Funktion mergesort() und Mischfunktion merge()
mergeSort(int[] liste, int links, int rechts): rekursiv Aufruf von merge()
merge(int[] listeA, int[] listeB, int links, int mitte, int rechts):
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Der Algorithmus
bestehend aus rekursiver Funktion mergesort() und Mischfunktion merge()
mergeSort(int[] liste, int links, int rechts): rekursiv Aufruf von merge()
merge(int[] listeA, int[] listeB, int links, int mitte, int rechts):
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Der Algorithmus
bestehend aus rekursiver Funktion mergesort() und Mischfunktion merge()
mergeSort(int[] liste, int links, int rechts): rekursiv Aufruf von merge()
merge(int[] listeA, int[] listeB, int links, int mitte, int rechts):
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Der Algorithmus
bestehend aus rekursiver Funktion mergesort() und Mischfunktion merge()
mergeSort(int[] liste, int links, int rechts): rekursiv Aufruf von merge()
merge(int[] listeA, int[] listeB, int links, int mitte, int rechts):
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Der Algorithmus
bestehend aus rekursiver Funktion mergesort() und Mischfunktion merge()
mergeSort(int[] liste, int links, int rechts): rekursiv Aufruf von merge()
merge(int[] listeA, int[] listeB, int links, int mitte, int rechts):
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Der Algorithmus
bestehend aus rekursiver Funktion mergesort() und Mischfunktion merge()
mergeSort(int[] liste, int links, int rechts): rekursiv Aufruf von merge()
merge(int[] listeA, int[] listeB, int links, int mitte, int rechts):
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Der Algorithmus
bestehend aus rekursiver Funktion mergesort() und Mischfunktion merge()
mergeSort(int[] liste, int links, int rechts): rekursiv Aufruf von merge()
merge(int[] listeA, int[] listeB, int links, int mitte, int rechts):
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Der Algorithmus
bestehend aus rekursiver Funktion mergesort() und Mischfunktion merge()
mergeSort(int[] liste, int links, int rechts): rekursiv Aufruf von merge()
merge(int[] listeA, int[] listeB, int links, int mitte, int rechts):
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
void mergeSort(int[] liste, int[] hilfsListe, int lo, int hi){ if (links<rechts) { int mitte=(links+rechts)/2; mergeSort(liste, hilfsListe, links, mitte); mergeSort(liste, hilfsListe, mitte+1, rechts); merge(liste, hilfsListe, links, mitte, rechts); }}
ImplementierungmergeSort(…)
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
void mergeSort(int[] liste, int[] hilfsListe, int lo, int hi){ if (links<rechts) { int mitte=(links+rechts)/2; mergeSort(liste, hilfsListe, links, mitte); mergeSort(liste, hilfsListe, mitte+1, rechts); merge(liste, hilfsListe, links, mitte, rechts); }}
Implementierung
void merge(int[] listeA, int[] listeB, int links, int mitte, int rechts){ int i, j, k; // beide Hälften von listeA in Hilfsarray listeB kopieren for (i=links; i<=rechts; i++) listeB[i] = listeA[i];
i=links; j=mitte+1; k=links; // jeweils das nächstgrößte Element zurückkopieren while (i<=mitte && j<=rechts) if (listeB[i] <= listeB[j]) listeA[k++]=listeB[i++]; else listeA[k++]=listeB[j++]; // Rest der vorderen Hälfte falls vorhanden zurückkopieren while (i<=mitte) listeA[k++]=listeB[i++];}
merge()mergeSort(…)
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Vor- und Nachteile
+ stabil+ im ungünstigsten Fall
eine Laufzeit proportional zu n: n*log(n) (siehe später im Kurs)
+ kann Daten sequentiell abarbeiten
- ein zu n proportionaler zusätzlicher Speicher wird benötigt
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Vergleich mit Insertionsort
einfach zu implementieren stabil bei großen Datenmengen wenig
effizient bei vorsortierten Datenmengen
effizient wenig Speicherbedarf (in-place)
kompliziert stabil bei großen Datenmengen
effizient bei vorsortierten Datenmengen
ineffizient zu n proportionaler
Speicherbedarf (out-of-place)
Insertionsort Mergesort
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger
Quellen
Algorithmen - Eine Einführung Autoren: Cormen, Leierson, Rivest und Stein Verlag: Oldenbourg Erscheinungsdatum: 8. September 2004
http://de.wikipedia.org/ „mergesort“ „insertionsort“ Stand: 17.06.2005
http://www.linux-related.de/index.html?/coding/sort/sort_merge.htm Stand: 17.06.2005