1. Будьте осторожны, перед нами динамический массив, сделанный расширением стека. Не на всех компиляторах есть, плюс стек ограничен парой мегабайт.
Нормализацию размера лучше сделать shift %= size;
Подпрограмма работает с локальной переменной и всё, что она делает, идёт на экран и больше никуда.
(вообще стоит разделять обработку и вывод!)
Время работы size.
2. Сдвигаем на один элемент нужное количество раз. Время работы shift·size.
3. Как за size «на месте»…
квоПрох := НОД(shift, size)
для i = [0..квоПрох)
i1 := i
tmp := a[i]
вечный цикл
i2 := (i1 + shift) % size
если i2 = i
прервать вечный цикл
a[i1] := a[i2]
i1 := i2
a[i1] := tmp