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 while i < j and A[i] < 0 do 4 i <- i + 1 5 while i < j and A[j] > 0 do 6 j <- j - 1 7 A[i] <-> A[j] 8 i <- i + 1 9 10 j <- j -1 11 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: