Ist das guter Sortieralgo?
also gut geschrieben?
static void mergeSort(int[] array) {
msort(array, 0, array.length - 1);
}
static void msort(int[] array, int left, int right) {
if (right > left) {
int mid = (right + left) / 2;
msort(array, left, mid);
msort(array, mid + 1, right);
int[] b = new int[array.length];
for (int k = left; k <= mid; k++)
b[k] = array[k];
for (int k = mid + 1; k <= right; k++)
b[right + mid + 1 - k] = array[k];
int i = left;
int j = right;
for (int k = left; k <= right; k++) {
if (b[i] < b[j])
array[k] = b[i++];
else
array[k] = b[j--];
}
}
}
1 Antwort
Naja was heißt "gut", das ist halt ein normaler Mergesort.
An sich hat ist Mergesort heutzutage kein guter Sortieralgorithmus mehr, da dieser O(n) zusätzlichen Speicher benötigt für eine n große Eingabemenge.
Soll heißen, auch wenn er im schlechtesten fall in O(n log(n)) läuft, Quicksort ist im avg-case schneller und benötigt keinen extra Speicher.
Das ist mitunter auch der Grund, warum Mergesort eigentlich nirgens implementiert ist.
Dazu sollte man bei diesen Algorithmen eher auf Bibliotheken zurückgreifen, da diese getestet sind und irgendwelche Randfälle besser abdecken.
Schau dir mal std::sort<>() aus der c++ Standardbibliothek an, der dort implementierte Algorithmus nennt sich "Introsort" und ist das schnellste was mit Vergleichsorientierten Sortierverfahren so geht.
Ist eine Mischung aus Quicksort, Heapsort und Insertionsort, und wenn man keinen stabilen Algorithmus braucht, auch den den man verwenden sollte.
LG
Also ich habe ihn in meinem Studium behandelt,daher ja ich verstehe ihn.
Es gibt mehrere Versionen von ihm, einen rekursiven und einen nicht rekursiven.
Das Prinzip ist relativ simpel, eine Liste wird einfach rekursiv in n große Teillisten zerteilt, die dann Schritt für schritt richtig sortiert zusammengefügt werden.
Bedenke hier aber dass die Rekursionen nacheinander abgearbeitet werden.
verstehst du mergesort auf anhieb, ich versteh den nicht ganz richtig