Zdravím,
mám problém se seřazením struktury pomocí quicksort (podle abecedy). Je definována následující struktura:
type
TZastavka = record
IndexZast: SmallInt;
IndexBodu: SmallInt;
CisloOIS: SmallInt;
Nazev10: String[10];
NazevPanel: ShortString;
//atd...
end;
var
ArrZastavky: Array of TZastavka;
a pomocí následující procedury se jí pokouším seřadit, mělo by se jednat o quicksort způsob:
procedure TStrukturyZast.ZamenitZastavky(const AIdx1, AIdx2: Integer);
var
Tmp: TZastavka;
begin
Tmp := ArrZastavky[AIdx1];
ArrZastavky[AIdx1] := ArrZastavky[AIdx2];
ArrZastavky[AIdx2] := Tmp;
end;
procedure TStrukturyZast.SeraditZastavkyQuickSort(const AStart, AEnd: Integer);
var
Left: Integer;
Pivot: string;
Right: Integer;
begin
if AStart >= AEnd then Exit;
Pivot := ArrZastavky[AStart].NazevPanel;
Left := AStart + 1;
Right := AEnd;
while Left < Right do
begin
if ArrZastavky[Left].NazevPanel < Pivot
(* nebo pro správné řazení českých znaků použito
if AnsiCompareStr(ArrZastavky[Left].NazevPanel, Pivot) = -1 //
výsledek je ale též chybný *)
then
Inc(Left)
else
begin
ZamenitZastavky(Left, Right);
Dec(Right);
end;
end;
Dec(Left);
ZamenitZastavky(Left, AStart);
Dec(Left);
SeraditZastavkyQuickSort(AStart, Left);
SeraditZastavkyQuickSort(Right, AEnd);
end;
výsledek však vypadá podivně, na prvních cca 50ti položkách vypadá funkčně, některé položky původně na konci se dostanou na začátek - tam kam patří, ovšem na některých místech je ve výsledku větší "rozsypání" než bylo před seřazením (stejné názvy byly před seřazením u sebe), viz výsledek vypsaný v tabulce:
Netušíte prosím kde je chyba? Zdroják QuickSortu jsem vyšašil někde na netu, upravil jsem si ho pro použití na této struktuře. Porovnával jsem ho s různými nalezenými zápisy, nenacházím žádnou syntaktickou odlišnost...
Díky, N.