Функция сдвига массива - C (СИ)
Формулировка задачи:
Доброго времени суток,
есть задача - нужно написать функцию, которая сдвигает массив array[] размером size на shift элементов.
соответственно, чтобы двигать вправо shift больше нуля, а влево наоборот.
под буфер в цикле нельзя выделять целый массив, можно только одну переменную, тоесть нужно максимально оптимизировать использование памяти.
сложность алгоритма не должна превышать O(N).
не пишите пожалуйста код, помогите с логикой задачи.
Раньше я делал вот так -
но требованиям задачи это не отвечало, сейчас ищу более оптимальный вариант.
ткните носом в ошибки меня говнокодера.
спасибо (-:
#include <stdio.h>
void arrayShift(int array[], int size, int shift) {
int temp[size];
int i;
for ( i = 0; i < size; i++ ) {
temp[( i + shift ) % size] = array[i];
}
for (i = 0; i < size; i++) {
array[i] = temp[i];
}
}Решение задачи: «Функция сдвига массива»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
int * rotate_array(int * array, const size_t count, const int steps) {
if ( steps < 0 ) {
int tmp = *array;
memmove(array, array + 1, sizeof(int) * (count - 1));
array[count - 1] = tmp;
return rotate_array(array, count, steps + 1);
}
else if ( steps > 0 ) {
int tmp = array[count - 1];
memmove(array + 1, array, sizeof(int) * (count - 1));
*array = tmp;
return rotate_array(array, count, steps - 1);
}
else
return array;
}
void dump(const int * array, size_t count) {
while ( count-- )
printf("%d%c", *array++, ( count ) ? ' ' : '\n');
}
#define SIZE (10)
int main(void) {
int arr[SIZE] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
dump(arr, SIZE);
/* три шаги налево */
dump(rotate_array(arr, SIZE, -3), SIZE);
/* две шаги направо */
dump(rotate_array(arr, SIZE, 2), SIZE);
/* шаг вперёд */
dump(rotate_array(arr, SIZE, -1), SIZE);
/* и две назад */
dump(rotate_array(arr, SIZE, 2), SIZE);
/* (c) Одесский фольклёр */
return 0;
}
Объяснение кода листинга программы
- В функции rotate_array происходит сдвиг массива на определенное количество шагов.
- Если шаги отрицательные, то сдвиг происходит влево, иначе - вправо.
- Если шаги равны нулю, то текущий элемент массива возвращается без изменений.
- В функции dump происходит вывод элементов массива на экран через заданный разделитель.
- В функции main создается тестовый массив из 10 элементов.
- Выводится содержимое тестового массива.
- Происходит сдвиг массива на 3 шага влево.
- Выводится содержимое сдвинутого массива.
- Происходит сдвиг массива на 2 шага вправо.
- Выводится содержимое сдвинутого массива.
- Происходит сдвиг массива на 1 шаг вперед.
- Выводится содержимое сдвинутого массива.
- Происходит сдвиг массива на 2 шага назад.
- Выводится содержимое сдвинутого массива.
- В конце программы выводится сообщение
Одесский фольклёр. - Программа возвращает 0, заканчивая свою работу.