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

И еще один вариант, где case заменен на if else, поскольку это тоже повышает (в общем случае) быстродействие.
Также исключены комментарии, поскольку высокоуровенный код и так является самодокументируемым.

Код:
var
  arRnd, arOdd, arEven: array of integer;
  var j: integer = 0;
  var k: integer = j;
const
  maxValue = 50; // Max value of rnd
  maxLen = 30; // arRnd.Length
begin
  SetLength(arRnd, maxLen);
  SetLength(arOdd, maxLen);
  SetLength(arEven, maxLen);

  for var i := Low(arRnd) to High(arRnd) do
    arRnd[i] := random(MaxValue + 1);

// Основное тело вычислений

  for var i := Low(arRnd) to High(arRnd) do
    if Odd(arRnd[i]) then begin
      arOdd[j] := arRnd[i]; Inc(j);
    end else begin
      arEven[k] := arRnd[i]; Inc(k);
    end;
      
  SetLength(arOdd, j);  
  SetLength(arEven, k);
  arOdd.Sort;
  Reverse(arOdd);
  arEven.Sort;

  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];
end.
P.S.
ЯП - PascalABC.Net.
Практически все это доступно на FreePascal и Delphi.

Последний раз редактировалось Viewer; 21.03.2017 в 20:17
Viewer вне форума   Ответить с цитированием
Ads

Яндекс

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