Вот набросал.
Принимает:
StringGrid - грид типа TStringGrid с данными;
RowIndx - номер строки, по которой выполнять сортировку;
StartCol - номер столбца, с которого начинается сортировка;
StopCol - номер столбца, на котором окончить сортировку;
Необходимо добавить проверки принимаемых значений и подумать о перестановке столбцов разом возможно через TStrings.
Код:
procedure Sort(var StringGrid: TStringGrid; RowIndx: Integer;
StartCol, StopCol: Integer);
var
Interval: Integer;
i, j: Integer;
Moved: Boolean; // пpизнак пеpестановки
Str: AnsiString;
begin
if StartCol > StopCol then
Exit;
// начальное значение интеpвала
Interval := (StopCol - StartCol) div 2;
// цикл с yменьшением интеpвала до 1
while Interval > 0 do
begin
// пyзыpьковая соpтиpовка с интеpвалом
// цикл, пока есть пеpестановки
Moved := True;
while Moved do
begin
Moved := False;
for i := StartCol to StopCol - (1 + Interval) do
begin
if AnsiCompareText(StringGrid.Cells[i, RowIndx],
StringGrid.Cells[i+Interval, RowIndx]) > 0 then
begin
// пеpестановка
for j := 0 to StringGrid.RowCount - 1 do
begin
Str := StringGrid.Cells[i, j];
StringGrid.Cells[i, j] := StringGrid.Cells[i+Interval, j];
StringGrid.Cells[i+Interval, j] := Str;
end;
// пpизнак пеpестановки
Moved := True;
end;
end;
end;
// yменьшение интеpвала
Interval := Interval div 2;
end;
end;