Изменение позиции элементов в массиве в си
Хочу максимально эффективно(с точки зрения скорости и нагрузки на память, без использования доп массивов)
Перемещать элементы в массиве чисел.
Допустим у нас есть массив чисел:
int a [5] = { 1, 2, 3, 4, 5 };
Дальше следует сканф и у нас стоит инструкция: 2(например) Что означает что мы должны подвинуть элементы на 2 позиции, получаем:
int b [5] = { 3, 4, 5, 1, 2 };
если имеем -1 на входе, получим:
int b [5] = { 5, 1, 2, 3, 4 };
Ответы (2 шт):
Автор решения: tym32167
→ Ссылка
Это делается при помощи 3 обращений. Вот код на C#
Функция, чтобы обернуть подмассив
void reverse(int[] data, int start, int end)
{
while (end > start)
{
int tmp = data[end];
data[end] = data[start];
data[start] = tmp;
end--;
start++;
}
}
Функция для смещения
void shift(int[] data, int pos)
{
while(pos < 0) pos+=data.Length;
reverse(data, 0, pos-1);
reverse(data, pos, data.Length - 1);
reverse(data, 0, data.Length - 1);
}
Проверка
int[] a = { 1, 2, 3, 4, 5 };
shift(a, 2);
Console.WriteLine(string.Join(",",a));
int[] b = { 1, 2, 3, 4, 5 };
shift(b, -1);
Console.WriteLine(string.Join(",", b));
Вывод
3,4,5,1,2
5,1,2,3,4
Автор решения: AlexGlebe
→ Ссылка
Массив со сдвигом.
int a[5];
int shift=-1;
int i = 3 ;
int x = a [ ( ( i + shift ) % 5 + 5 ) % 5 ] ;
// 3 -> 2
или с дополнительной функцией
int * Elt(int i) {
return & a [ ( ( i + shift ) % 5 + 5 ) % 5 ] ;
}
x = * Elt ( 2 ) ;
* Elt ( 3 ) = 7 ;