Einzelnen Beitrag anzeigen

Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#73

AW: Doppel schnell aus Lise löschen.

  Alt 11. Dez 2014, 00:15
Wow. Schau ich mir. Thanx.

Ich hab auch noch einen (allerdings wie gehabt mit Quicksort):

Delphi-Quellcode:
procedure TFloatPoints.Sort;
const
  Eps = 1E-4;
var
  X: double;
  A, B: integer;
begin
  // Koordinaten können mit einem instabilen Sortierverfahren nicht eindimensional sortiert werden;
  // Wir wollen aber mit dem QuickSort sortieren, weil eben schnell;
  // Deshalb sortieren wir zuerst nach X (SortByX) und anschließend alle Punkte
  // mit den gleichen X-Werten nach Y (SortByY);
  // Wir sortieren auch desshalb, weil wir Doppel schnell rauslöschen wollen;
  // Wir sortieren also zunächst (die ganze Liste) nach X;
  QuickSort(0, FCount - 1, SortCompareX);
  // Jetzt suchen wir alle Punkte mit den gleichen X-Werten und sortieren diese nach Y;
  A := 0;
  while A < FCount do
  begin
     X := FItems[A].X; // Wir suchen Punkte mit diesem X-Wert;
     B := A; // A = Index des 1. aktuellen X-Wertes, B = Index des letzten aktuellen X-Wertes;
     while (B < FCount - 1) and (SameValue(X, FItems[B + 1].X, Eps)) do
       Inc(B);
     // Nun sortieren wir diesen Teil der Liste nach Y;
     if B > A then // Wenn es mehr als 1 Punkt gibt;
     begin
       QuickSort(A, B, SortCompareY);
       A := B; // Indices A bis B abgearbeitet;
     end;
     Inc(A); // Mit diesem Index geht es weiter;
  end;
end;
  Mit Zitat antworten Zitat