Урок 23 Задача 2

Урок 23 Задача 2:

Есть массив (пусть не более 10 элементов):

[0, 3, 2, 1, 0, 3, 2, 4, 0, -5]

Задача: перенести все нули в конец, так чтобы в итоге получилось:

[3, 2, 1, 3, 2, 4, -5, 0, 0, 0]

Решите:

Любым способом
Решите со сложностью не более чем 2N (не заводя дополнительных массивов)

Примечание: давалась как простая разминочная задачка для собеседования в Яндекс.

type
  massiv = array[1..10] of integer;
var
  m: massiv;
  i,              // счетчик
  x               // шаг сдвига
  : integer;
begin
  m[1] := 0;
  m[2] := 3;
  m[3] := 2;
  m[4] := 1;
  m[5] := 0;
  m[6] := 3;
  m[7] := 2;
  m[8] := 4;
  m[9] := 0;
  m[10] := -5;
  x:= 1;               // начальный шаг сдвига
  i:= low(m);
  while not(i+x > high(m)) do     // пока сдвиг не заходит за пределы массива
  begin
    if m[i] = 0 then          // если встретился 0
    begin
      if m[i+x] = 0 then      // если, в случае сдвига, снова встретится 0
        x:= x + 1             // увеличиваем шаг сдвига
      else begin              // если, в случае сдвига, встретится не 0
        m[i]:= m[i+x];        // сдвигаем
        m[i+x]:=0;            // в позицию "сдвинутого" числа пишем 0
      end;
    end;
    if not (m[i] = 0) then    // если элемент не 0
      i:= i+1;                // переходим к след. элементу
  end;
  for i:= low(m) to high(m) do
    write(m[i], '  ');
  readln();
end.

Консоль:

3  2  1  3  2  4  -5  0  0  0