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;