Алгоритм циклической перестановки данных позволяет осуществить циклический сдвиг одномерного массива из N элементов на k позиций вправо или влево. 1
Вот несколько алгоритмов, которые работают по-разному:
- Алгоритм A. 1 Первый элемент массива x0 помещается во временную переменную t. 1 Оставшиеся N — 1 элементов массива перемещаются на одну позицию влево, и в конец массива помещается содержимое переменной t. 1 После применения данной процедуры m = k mod N раз получается необходимая перестановка. 1
- Алгоритм B. 1 Элемент x0 помещается во временную переменную t, затем x[m] помещается в x0, x[2m] — в x[m] и так далее (перебираются все элементы массива x с одинаковыми по модулю N индексами), пока не возвращается к элементу x0, вместо которого записывается содержимое переменной t. 1 Если при этом не были переставлены все элементы, процедура повторяется, начиная с x1, и так далее до достижения конечного результата. 1
- Алгоритм C. 2 Циклический сдвиг массива x сводится фактически к замене αβ на βα, где α — первые k элементов массива x, β — оставшиеся элементы. 2 Для определённости предположим, что α короче β. 2 Тогда разобьём β на βleft и βright, где βright содержит k элементов (столько же, сколько и α). 2 Поменяем местами α и βright, при этом α окажется в конце массива — там, где и полагается. 3 Поэтому можно сосредоточиться на перестановке βleft и βright. 3 Эта задача сводится к начальной, поэтому алгоритм можно вызывать рекурсивно. 3