переключение элементов между массивом

#algorithm

#алгоритм

Вопрос:

У меня есть массив из n элементов, и я хочу написать функцию для переключения элементов между массивом следующим образом :

1 2 3 —> 3 1 2 —> 2 3 1 —> 1 2 3

Я не могу придумать простой алгоритм для этого. Пожалуйста, помогите. Это не домашнее задание.

Комментарии:

1. Если вы просто вращаете массив — зачем? Просто предоставьте интерфейс для доступа к массиву, который может справиться с модульной индексацией. т. е. может начинаться в любом месте этого массива и возвращаться к нулю, когда это необходимо.

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

Ответ №1:

Используйте очередь вместо списка. Ставьте в очередь элемент, исключенный из очереди, для каждого шага.

Другой альтернативой является использование циклического буфера. Просто оставьте массив как есть и имейте указатель на первый элемент, перемещайте указатель на каждом шаге. Считывание массива в два этапа. 1. От указателя до конца. 2. От начала до указателя.

Третья альтернатива — просто менять местами элементы один за другим.

 int tmp = arr[0];
for(int i = 0; i < arr.Length - 1; i  )
{
    arr[i] = arr[i 1];
}
arr[arr.Length - 1] = tmp;
  

Комментарии:

1. Я думаю, у вас здесь ошибка. Вы можете увидеть это, если длина вашего массива равна 2. В этом случае код внутри цикла никогда не будет выполнен, и ваш массив будет иметь то же значение в arr[0] и arr[1] . Ваше управление циклом должно быть либо i < arr.Length - 1 , либо i <= arr.Length - 2 .

Ответ №2:

Вы просто хотите повернуть массив?

   // Rotate left
  int temp = a[0];
  for (int i = 0; i < a.Length-1;   i)
    a[i] = a[i 1];
  a[a.Length-1] = temp;

  // Rotate right
  int temp = a[a.Length-1];
  for (int i = a.Length-1; i > 0; --i)
    a[i] = a[i-1];
  a[0] = temp;