280 likes | 716 Views
Mergesort. Divide and Conquer. Gliederung. Allgmeine Informationen Funktionsweise Der Algorithmus Implementierung Vor- und Nachteile Vergleich mit Insertionsort Quellen. Allgemeine Informationen. 1945 von John von Neumann vorgestellt rekursiv
E N D
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger Mergesort Divide and Conquer
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger Gliederung • Allgmeine Informationen • Funktionsweise • Der Algorithmus • Implementierung • Vor- und Nachteile • Vergleich mit Insertionsort • 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 Implementierung 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); } }
Präsentationsprüfung Informatik 2005 Patrick Stürmlinger Implementierung 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) listeA[k++]=listeB[i++]; } 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); } }
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 Vor- und Nachteile
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) Insertionsort Mergesort • kompliziert • stabil • bei großen Datenmengen effizient • bei vorsortierten Datenmengen ineffizient • zu n proportionaler Speicherbedarf (out-of-place)
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