Функция сдвига массива - 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, заканчивая свою работу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д