Einzelnen Beitrag anzeigen

Udontknow

Registriert seit: 17. Jun 2002
223 Beiträge
 
#7
  Alt 27. Aug 2002, 22:59
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
  Mit Zitat antworten Zitat