Показать сообщение отдельно
Старый 22.03.2017, 21:48   #13 (permalink)
Viewer
Banned
 
Регистрация: 06.03.2017
Сообщений: 788
Сказал(а) спасибо: 0
Поблагодарили 18 раз(а) в 4 сообщениях
Репутация: 5680
По умолчанию

Вариантов решения задач - масса. Главное, чтобы они были понятны студентам.
Так-то вообще все решается в "одну строчку" 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.
Viewer вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070