Insertion-Sort
-
Hey Leute,
brauche mal wieder eure Hilfe, diesmal bei der Implementierung von Inserion-Sort.
Aufgabe ist es, verschiedene Sortier-Algorithmen zu implementieren und via O-Notation zu vergleichen.
Jedenfalls will mein Insertion-Sort nicht so ganz.
void insertionsort(int numbers[], int start, int end) { int i, k, current; for (i=start+1; i<=end; i++) { printf("Test\n"); current=numbers[i]; for (k=i-1; k>=start; k--); { if (numbers[k]>current) { numbers[k+1]=numbers[k]; } else { break; } } numbers[k+1]=current; } }
start hat den Wert 0, end 8.
Das Problem scheint am break zu liegen.
Ist break auskommentiert, wird "Test" 8 mal ausgegeben, ansonsten nur 1 mal.
break scheint sich also auf die erste for-Schleife zu beziehen, was für mich unbegreiflich ist.
-
Der Fehler ist das hier:
for (k=i-1; k>=start; k--); // ^
Hier die richtige Version:
//.... int numbers[10] = {94, 89, 41, 23, 18, 73, 51, 31, 85, 113}; int i, j, k, current; int start = 0, end = 8; for(i = start + 1; i < end; i++) { printf("Durchlauf #%d: ", i); // infos for(j = start; j < end; j++) // infos printf("%d ", numbers[j]); // infos printf("-> "); // infos for(k = i - 1, current = numbers[i]; k >= start && numbers[k] > current; k--) numbers[k+1] = numbers[k]; numbers[k+1] = current; for(j = start; j < end; j++) // infos printf("%d ", numbers[j]); // infos printf("\n"); // infos } // ....
-
Ähm, ehrlich gesagt sehe ich in der Version keinerlei Unterschied zu meiner.
Kann mir jmd. auf die Sprünge helfen?
-
(a) Dann lies meinen Post nocheinmal Wort für Wort von oben bis unten.
EDIT: Es gibt einen Unterschied in unseren Versionen. Gehe zu (a).
-
Ah, jetz seh ichs auch. Oh man. Danke dir.
-
Ich hab mich etwas unglücklich ausgedrückt. Es gibt genau 2 Unterschiede in unseren Versionen. Einen offentsichtlichen und einen eher subtilen, aber wichtigen. Wenn du also ingesamt 2 Unterschiede gefunden hast, bist du am Ende. Ansonsten vergleich noch mal gaaanz genau und gehe zu (a).
-
Das überflüssige Semikolon und das <=. Danke dir.
-
-
Allerdings ist
for (i=start+1; i<=end; i++)
korrekt. ^^
EDIT: Verwendet man <, bleibt das letzte Element unsortiert.
-
Kommt drauf an wie du zählst. Zählst du in Array Notation dann hast du Recht und du solltest auf kleiner, gleich testen.