Ну, у тебя тоже через массивы сделано
На самом деле это не принципиально. просто придется на каждом шаге производить конвертацию в числовой формат, да чистить стринг лист подругому.
честно говоря лень писать код.
идея такова.
1. Идем по ячейкам и переносим все нечетные числа в другой грид, заменяя их пустой строкой.
2. Убираем все пустые строки из первого грида путем переноса заполненных ячеек вверх. Тут нетривиальный алгоритм.
3. Сортируем оба грида.
Код:
procedure MoveOdds(AGrid1, AGrid2 : TStringGrid);
var
I, N : Integer;
begin
AGrid2.RowCount := 0;
For I := 0 To AGrid1.RowCount-1 Do
Begin
N := strToInt(AGrid1.Cells[0,I]);
If Not (N mod 2 = 0) Then
Begin
AGrid2.RowCount := AGrid2.RowCount + 1;
AGrid2.Cells[0,AGrid2.RowCount-1] := AGrid1.Cells[0,I];
AGrid1.Cells[0,I] := '';
End;
End;
end;
procedure CompactGrid(AGrid : TStringGrid);
var
I, Sh : Integer;
begin
Sh := 0;
For I := 0 To AGrid.RowCount-1 Do
If AGrid.Cells[0,I] <> ''
Then AGrid.Cells[0,I] := AGrid.Cells[0,I+Sh]
Else Inc(Sh);
end;
procedure SordGrid(AGrid : TStringGrid);
var
I, J : Integer;
Buf : String;
begin
For I := 0 To AGrid.RowCount-2 Do
For J := I + 1 To AGrid.RowCount-1 Do
If StrToInt(AGrid.Cells[0,I]) > StrToInt(AGrid.Cells[0,J]) Then
Begin
Buf := AGrid.Cells[0,I];
AGrid.Cells[0,I] := AGrid.Cells[0,J];
AGrid.Cells[0,J] := Buf;
End;
end;
procedure ProcessGrids(AGrid1, AGrid2 : TStringGrid);
begin
MoveOdds(AGrid1, AGrid2);
CompactGrid(AGrid1);
SordGrid(AGrid1);
SordGrid(AGrid2);
end;