Ну и, наверное, для метода поочередной обработки массива по частям - минимальный вариант:
Опять же - код прозрачен и легко понимаем.
Код:
var
ar: array of integer;
const
maxValue = 60; // Max value of rnd
maxLen = 19; // ar.Length
procedure _Swap(ar: array of integer; i,j: integer);
var x: integer;
begin
x := ar[i];
ar[i]:=ar[j];
ar[j]:=x;
end;
begin
// Init
SetLength(ar, maxLen);
for var i := Low(ar) to High(ar) do
ar[i] := random(MaxValue + 1);
write('rnd= ', ar.Length,' ', ar);
writeln();
// Body
var k: integer = 0;
var x: integer;
// Even to head
for var i :=0 to ar.High do
if not Odd(ar[i]) then begin
x := ar[i];
for var j := i downto k+1 do
ar[j] := ar[j-1];
ar[k] := x;
Inc(k);
end;
// Sort even
for var i:=0 to k-2 do
for var j :=i to k-1 do
if ar[i] < ar[j] then _Swap(ar,i,j);
// Sort odd
for var i := k to ar.High-1 do
for var j :=i to ar.High do
if ar[i] > ar[j] then _Swap(ar,i,j);
write('sort=', ar.Length,' ', ar);
writeln();
end.