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