Еще один вариант, где исключена сортировка начального большого массива, но введены сортировки двух усеченных массивов. Это к вопросу о методике повышения скорости выполнения, т.к. один большой массив сортируется дольше, чем два массива половинной размерности. Чисто методическое решение.
Код:
var
arRnd, arOdd, arEven: array of integer;
const
maxValue = 50; // Max value of rnd
maxLen = 30; // arRnd.Length
begin
SetLength(arRnd, maxLen);
SetLength(arOdd, maxLen);
SetLength(arEven, maxLen);
// Init
for var i := Low(arRnd) to High(arRnd) do
arRnd[i] := random(MaxValue + 1);
write('len=', arRnd.Length,' ', arRnd);
writeln();
// separate odd and even
var j: integer = 0;
var k: integer = j;
for var i := Low(arRnd) to High(arRnd) do
case Odd(arRnd[i]) of
True: begin
arOdd[j] := arRnd[i];
Inc(j);
end;
False: begin
arEven[k] := arRnd[i];
Inc(k);
end;
end;
// truncate
SetLength(arOdd, j);
SetLength(arEven, k);
// sort up
arOdd.Sort;
// reverse
Reverse(arOdd);
// sort up
arEven.Sort;
// splice
for var i := Low(arOdd) to High(arOdd) do
arRnd[i] := arOdd[i];
for var i := Low(arEven) to High(arEven) do
arRnd[arOdd.Length + i] := arEven[i];
// out
write('j=',j,' ',arOdd);
writeln();
write('k=',k,' ', arEven);
writeln();
write('j+k=',j+k,' ', arRnd);
end.