Вариантов решения задач - масса. Главное, чтобы они были понятны студентам.
Так-то вообще все решается в "одну строчку" ar.Sort(lambda);
Для студентов более понятен метод "разделяй и властвуй" и более высокоуровневый стиль.
Пример работы над массивом "на месте", но с разделением обработки четных и нечетных чисел. Процедуры сортировки могут быть объединены в одну, но это - снижение наглядности.
Код:
var
arRnd: array of integer;
const
maxValue = 60; // Max value of rnd
maxLen = 31; // arRnd.Length
function Even_ahead(ar: array of integer): integer;
var k: integer = 0;
var x: integer;
begin
for var i :=0 to ar.Length-1 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;
Result := k;
end;
procedure _Swap(ar: array of integer; i,j: integer);
var x: integer;
begin
x := ar[i];
ar[i]:=ar[j];
ar[j]:=x;
end;
procedure Odd_Sort(ar: array of integer; k: integer);
var x: integer;
begin
for var i := k to ar.Length-2 do
for var j :=i to ar.Length-1 do
if ar[i] > ar[j] then _Swap(ar,i,j);
end;
procedure Even_Sort(ar: array of integer; k: integer);
var x: integer;
begin
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);
end;
begin
SetLength(arRnd, maxLen);
for var i := Low(arRnd) to High(arRnd) do
arRnd[i] := random(MaxValue + 1);
write('rnd=', arRnd.Length,' ', arRnd);
writeln();
var k: integer = 0;
// Тело основного цикла
k := Even_Ahead(arRnd);
Even_Sort(arRnd, k);
Odd_Sort(arRnd, k);
write('rnd=', arRnd.Length,' ', arRnd);
writeln();
end.