Hallo, ich bins nochmal!
Irgendwo war da noch der Wurm in der Partition-Routine.
Warum setzt du das vergleichende Element eigentlich auf das rechte Ende der Folge? In meiner Algorithmus-Beschreibung steht, das das mittlere Element für den Vergleich ausgewählt werden muss...
Naja, ich habe es noch einmal neu aufgesetzt, allerdings mit while-Schleifen anstelle von Repeat-Until-Konstrukten. So klappts.
In diesem Fall sortiere ich Objekte, die sich in einer Liste befinden und von meiner Klasse TStempIDComponentList verwaltet werden. ich sortiere nach dem Attribut ID der einzelnen Objekte.
Code:
procedure TStempIDComponentList.SwapValues(Index1, Index2: Integer);
var P:Pointer;
begin
P:=Items[Index1];
Items[Index1]:=Items[Index2];
Items[Index2]:=P;
end;
function TStempIDComponentList.Partition(l, r: Integer): Integer;
var x,i,j : Integer;
begin
//Mittleres Element x bestimmen
x:=r+l div 2;
//Elemente von aussen nach innen durchgehen & evt. vertauschen
i:=l;
j:=r;
//Solange vorgehen, bis Grenzen angenähert
while (i<j) do
begin
//Äußerstes Element der linken Seite bestimmen, das verschoben werden muss
//(Vergleich des Feldes ID der Objekte)
while (Items[i].ID<Items[x].ID) do
Inc(i);
//Äußerstes Element der rechten Seite bestimmen, das verschoben werden muss
//(Vergleich des Feldes ID der Objekte)
while (Items[j].ID<Items[x].ID) do
Dec(j);
//Werte vertauschen
SwapValues(i,j);
end;
Result:=i;
end;
Cu,
Udontknow