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

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

Код:
var
  arRnd, arOdd, arEven: array of integer;
const
  maxValue = 9; // 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);
// Sort up   
  arRnd.Sort;
  write('len=', arRnd.Length,' ', arRnd);
  writeln();

// separate odd and even   
  var j: integer = 0;
  var k: integer = j;
  for var i := High(arRnd) downto Low(arRnd) do
    begin
      case Odd(arRnd[i]) of
        True: begin
                arOdd[j] := arRnd[i];
                Inc(j);
              end;
        False: begin
                arEven[k] := arRnd[i];
                Inc(k);
              end;
      end;  
    end;
// truncate
  SetLength(arOdd, j);  
  SetLength(arEven, k);
// 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[j + i] := arEven[i];
// out 
  write('j=',j,' ',arOdd);
  writeln();
  write('k=',k,' ', arEven);
  writeln();
  write('j+k=',j+k,' ', arRnd);
  
end.
Код:
len=30 [0,1,1,1,2,2,2,3,3,3,3,4,5,5,5,6,6,6,7,7,7,7,7,7,7,8,8,8,9,9]
j=19 [9,9,7,7,7,7,7,7,7,5,5,5,3,3,3,3,1,1,1]
k=11 [0,2,2,2,4,6,6,6,8,8,8]
j+k=30 [9,9,7,7,7,7,7,7,7,5,5,5,3,3,3,3,1,1,1,0,2,2,2,4,6,6,6,8,8,8]
Viewer вне форума   Ответить с цитированием
Ads

Яндекс

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