Sie sind auf Seite 1von 2

Aufgabe 2

Idee: Der Algorithmus bestimmt zwei Laufvariablen, die mit Start-, bzw. Endindex des zu sortierenden Arrays initialisiert werden. Nun sollen diese Variablen i, j jeweils zu Mitte laufen, wobei jedes Mal, wenn zwei Indices gefunden wurden, deren zugeschriebener Wert nicht in die entsprechende Arrayhlfte passt, eine Vertauschung der Werte an Platz i und j vorgenommen wird. Dieser Vorgang luft so lange, wie i < j.

Pseudo-Code:
Sort-Neg-Pos(A) i <- 1 1 j <- Lenght(A) 2 while i < j do 3 Laufzeit t1 = t2 = t3 = t4 = t5 = t6 = t7 = t8 = t9 = t10= t11=


4 5 6 7 8 9 10 11

while i < j and A[i] < 0 do i <- i + 1 while i < j and A[j] > 0 do j <- j - 1 A[i] <-> A[j] i <- i + 1 j <- j -1 return A

Beweis der Korrektheit:


Invariante: Sei n von nun an die Lnge des gegebenen Arrays. INV := {Fr alle l aus {1, ,n} mit l < i < j gilt A[l] < 0 und fr alle r aus {1, ,n} mit i < j < r gilt A[r] > 0} Die Wahl erklrt sich wie folgt: Bei jeder Iteration der oberen while-Schleife soll sichergestellt sein, dass sich links von i die negativen, und rechts von j die positiven Elemente befinden. Je nher sich i und j also kommen, desto mehr Elemente wurden korrekt sortiert. Dieser Zusammenhang soll durch die INV deutlich werden. Initialisierung: Da zu Anfang i auf 1, also dem ersten Index des Arrays gesetzt wird, und j auf Length(A), also dem letzten Index des Arrays gesetzt wird, gilt die INV vor dem ersten Schleifendurchlauf, da alle Elemente links vom i und rechts vom j korrekt sortiert sind (bisher also noch keins). Erhaltung: In den Zeilen 4-5 wird eine Schleife durchlaufen, in der dafr gesorgt wird, dass i solange inkrementiert wird, bis i einen Index angenommen hat, dessen zugeschriebener Wert nicht mehr grer als Null ist. Folglich bleibt selbst hier noch die INV erhalten, da die Schleife abbricht, bevor links vom i ein Wert sein kann, der grer als Null ist. Analog dazu funktioniert die Argumentation fr die folgende Schleife in den Zeilen 6-7, nur das hier j dekrementiert wird, die INV aber trotzdem erhalten bleibt. Anschlieend, in Zeile 8, werden die beidseitig gefundenen, nicht konformen Werte auf i und j miteinander getauscht und in den Zeilen 9-10 i und j zur Wiederherstellung der Invariante erhht, bzw. erniedrigt. Am Ende der Schleife befinden sich also wieder links vom i nur negative Werte, und rechts vom j nur positive. Terminierung:

Die Schleife luft solange, bis die Bedingung i < j nicht mehr zutrifft. Da nach jeder Vertauschung aber i und j jeweils erhht und erniedrigt werden, knnen hier zwei Flle auftreten: Fall i = j + 1: Hier lsst sich ohne weiteres sagen, dass die INV final gilt, also alle Elemente links vom i negativ, und alle rechts vom i positiv sind, womit dann auch logischerweise das ganze Array beschrieben wurde und somit in Zeile 11 das korrekt sortierte Array ausgegeben wird (Linke Seite: 1 bis (i 1) Rechte Seite: i bis n. Anz. Der Elemente links: i-1, Anz. Der Elemente rechts: n j Also msste die Anzahl aller Elemente beschrieben werden durch: i-1 + n-j ; da i = j + 1 folgt Anz = (j+1)-1 + n j = n). Fall i = j: Die Schleife terminiert natrlich auch in diesem Fall, da i < j nicht mehr gilt. Nun ergibt sich aber das Problem, dass nach der Invariante noch nicht das gesamte Array untersucht wurde, es fehlt nmlich das Element an der Stelle i=j. Allerdings wurde das Array ja von links und von rechts aufeinander zulaufend sortiert, d.h. das Element i = j steht genau zwischen der linken Seite, den negativen und der rechten Seite, den positiven Werten. Es ist von daher egal ob A[i=j] positiv oder negativ ist, es steht bereits an der richtigen stelle, und somit wird in Zeile 11 ein korrekt sortiertes Array zurckgegeben. Anz. der Elemente links: i ; Anz. der Elemente rechts: n j ; da i = j folgt fr die Gesamtanzahl der Elemente n j + i = n i + i = n.

Speicherplatzbedarf:
Dieser Algorithmus arbeitet in-place , er arbeitet also innerhalb des bergebenen Arrays und braucht deshalb zunchst einmal nur Speicher in der Grenordnung O(n). Dazu kommen dann konstante Werte zum Speichern von i und j, also immer noch O(n). Temporr knnte dann noch ein konstanter Speicher fr das Zwischenspeichern einer Variable in Zeile 8 dazukommen, was die Gesamt-Grenordnung allerdings auch nicht erhht, da der lineare Term die konstanten dominiert => O(n).

Laufzeitanalyse:
Auf den ersten Blick mchte man abschtzen, dass der Algorithmus aufgrund seiner Schleifenstruktur in etwa eine quadratische Laufzeit hat. Bei genauerer Betrachtung fllt allerdings auf, dass ja bei jedem Durchlauf der Schleife in den Zeilen 3-10 die untergeordneten Schleifen aus 4-5 und 6-7 nur dann betreten werden, wenn der jeweils aktuelle Index auf eine bereits richtig einsortierte Zahl zeigt. Durch das daraus resultierende Iterieren und Dekrementieren der Laufvariablen,braucht die bergeordnete Schleife proportional weniger Durchlufe um i und j aneinander vorbeizufhren, als vorher angenommen. Sei nun m die Anz. der negativen Elemente und p die der positiven, es gilt dann m + p = n. Fr die Schleifen ergeben sich also die nach oben abgeschtzt Folgende Laufzeiten: 

Diese Betrachtung wrde bedeuten, dass alle positiven und negativen Zahlen bereits an der richtigen Stelle im Array positioniert waren. Der Rckschluss von dieser Laufzeit als allgemeine Laufzeit gilt allerdings, da dieser Fall tatschlich den Worst-Case darstellt, denn sonst wrden die While-Schleifen in den Zeilen 4-7 weniger betreten werden (wenn nicht sogar gar nicht) und i und j wrden schneller aufeinander zulaufen.