Vulpecula
Commander
- Registriert
- Nov. 2007
- Beiträge
- 2.241
Hallo zusammen!
Ich beschäftige mich gerade mit dem Algorithmus für das Sortieren durch Einfügen. Die Funktionsweise ist mir klar und das umsetzten in Java-Code ist auch kein Problem, nur bin ich jetzt in der Literatur über etwas gestolpert, das ich mir (noch) nicht erklären kann.
Und zwar wird hier von einer "Verbesserung" gesprochen, die dadurch erreicht wird, dass man vor dem eigentlichen Sortiervorgang das kleinste Element an den Anfang der Liste bzw. des Arrays setzt.
Folgende Angaben gab es zu dem unten stehenden Listing:
Kann mir jemand erklären, WARUM das ganze schneller sein soll? Immerhin wird doch auch beim "normalen" InsertionSort geprüft, ob das Vorgänger-Element kleiner ist oder nicht und die innere Schleife terminiert, sobald dies der Fall ist.
MfG - Vulpecula
P.S.: So habe ich das vor einiger Zeit mal umgesetzt:
Ich glaube ich habe den Fehler gefunden. Vorne im Buch dümpelte noch ein Listing herum, in dem InsertionSort wiefolgt gelöst war und auf das sich die "verbesserte Methode" bezieht:
Sie Schreiben zwar, dass es InsertionSort sein soll, aber meiner Meinung nach ist das kein richtiges Sortieren durch Einfügen.
Im Prinzip hatte ich das in meiner Methode schon so umgesetzt. Lediglich das mit dem den Nachvornholen des kleinsten Elements macht mich stutzig...
Ich beschäftige mich gerade mit dem Algorithmus für das Sortieren durch Einfügen. Die Funktionsweise ist mir klar und das umsetzten in Java-Code ist auch kein Problem, nur bin ich jetzt in der Literatur über etwas gestolpert, das ich mir (noch) nicht erklären kann.
Und zwar wird hier von einer "Verbesserung" gesprochen, die dadurch erreicht wird, dass man vor dem eigentlichen Sortiervorgang das kleinste Element an den Anfang der Liste bzw. des Arrays setzt.
Folgende Angaben gab es zu dem unten stehenden Listing:
- kleinstes Element wandert nach vorne, dient dann als Markierungsschlüssel
- innere Schleife hat nur noch eine Zuweisung, keine Austauschoperation
- innere Schleife terminiert, wenn das Element an seiner Position ist
Code:
static void insertion(ITEM[] a, int l, int r) {
int i;
for (i = r; i > l; i--) compExch(a, i-1, i);
for (i = l+2; i <= r; i++) {
int j = i; ITEM v = a[i];
while (less(v, a[j-1])) {
a[j] = a[j-1]; j--;
}
a[j] = v;
}
}
Kann mir jemand erklären, WARUM das ganze schneller sein soll? Immerhin wird doch auch beim "normalen" InsertionSort geprüft, ob das Vorgänger-Element kleiner ist oder nicht und die innere Schleife terminiert, sobald dies der Fall ist.
MfG - Vulpecula
P.S.: So habe ich das vor einiger Zeit mal umgesetzt:
Code:
private static int[] InsertionSort(int[] inputArray)
{
for (int i = 1; i < arrayGroesse; i++)
{
int k = inputArray[i];
int j = i - 1;
while ((j > -1) && (inputArray[j] > k))
{
inputArray[j+1] = inputArray[j];
j = j - 1;
}
inputArray[j+1] = k;
}
sortiertesArrayIS = inputArray.clone();
return sortiertesArrayIS;
}
Ergänzung ()
Ich glaube ich habe den Fehler gefunden. Vorne im Buch dümpelte noch ein Listing herum, in dem InsertionSort wiefolgt gelöst war und auf das sich die "verbesserte Methode" bezieht:
Code:
static void sort(double[] a, int l, int r) {
for (int i = l+1; i <= r; i++)
for (int j = i; j > l; j--)
compExch(a, j-1, j);
}
Sie Schreiben zwar, dass es InsertionSort sein soll, aber meiner Meinung nach ist das kein richtiges Sortieren durch Einfügen.
Im Prinzip hatte ich das in meiner Methode schon so umgesetzt. Lediglich das mit dem den Nachvornholen des kleinsten Elements macht mich stutzig...
Zuletzt bearbeitet: