Mergesort Divide and Conquer Präsentationsprüfung Informatik 2005 Patrick Stürmlinger Mergesort Divide and Conquer
Gliederung Allgmeine Informationen Funktionsweise Der Algorithmus Präsentationsprüfung Informatik 2005 Patrick Stürmlinger Allgmeine Informationen Funktionsweise Der Algorithmus Implementierung Vor- und Nachteile Vergleich mit Insertionsort Quellen
Allgemeine Informationen Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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
Funktionsweise Listen werden so weit wie möglich geteilt Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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
Der Algorithmus Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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):
Der Algorithmus Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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):
Der Algorithmus Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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):
Der Algorithmus Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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):
Der Algorithmus Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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):
Der Algorithmus Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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):
Der Algorithmus Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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):
Der Algorithmus Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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):
Der Algorithmus Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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):
Implementierung mergeSort(…) Präsentationsprüfung Informatik 2005 Patrick Stürmlinger mergeSort(…) 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 mergeSort(…) merge() Präsentationsprüfung Informatik 2005 Patrick Stürmlinger mergeSort(…) merge() 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) } 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); }
Vor- und Nachteile stabil Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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
Vergleich mit Insertionsort Präsentationsprüfung Informatik 2005 Patrick Stürmlinger Insertionsort Mergesort 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)
Quellen Algorithmen - Eine Einführung http://de.wikipedia.org/ Präsentationsprüfung Informatik 2005 Patrick Stürmlinger 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