A Delphi implementation of the Shellsort algorithm

Answer

function FirstLow(var A, B: Str64): Boolean;
begin
if A < B then
FirstLow := True
else
FirstLow := false;
end;

procedure BinArraySort(Start, Finish: Integer; var Data: PosAry);
var
StarterKey: Str64;
Temp: PositionRec; {see remark below}
Left: Integer;
Right: Integer;
begin
Left := Start;
Right := Finish;
StarterKey := Data[(Start + Finish) div 2].PBStr;
repeat
while FirstLow(Data[Left].PBStr, StarterKey) do
Left := Left + 1;
while FirstLow(StarterKey, Data[Right].PBStr) do
Right := Right – 1;
if Left <= Right then
begin
Temp := Data[Left];
Data[Left] := Data[Right];
Data[Right] := Temp;
Left := Left + 1;
Right := Right – 1;
end;
until
Right <= Left;
if Start < Right then
BinArraySort(Start, Right, Data);
if Left < Finish then
BinArraySort(Left, Finish, Data);
end;

Remark:

PositionRec = record
PBStr: Str64; {key}
{additional fields}
end;

PosAry = array[1..??] of PositionRec;
PosAryPtr = ^PosAry

is better than just the array itself. Then:

procedure BinArraySort(Start, Finish: Integer; Data: PosAryPtr);

The caller:

var
PA: PosAryPtr;
begin
BinArraySort(1, BItems, PA);