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

Ну и, наверное, для метода поочередной обработки массива по частям - минимальный вариант:
Опять же - код прозрачен и легко понимаем.

Код:
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.
Viewer вне форума   Ответить с цитированием
Ads

Яндекс

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