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

Еще один вариант, где исключена сортировка начального большого массива, но введены сортировки двух усеченных массивов. Это к вопросу о методике повышения скорости выполнения, т.к. один большой массив сортируется дольше, чем два массива половинной размерности. Чисто методическое решение.

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

Яндекс

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