Функция сдвига массива - 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;
}

Объяснение кода листинга программы

  1. В функции rotate_array происходит сдвиг массива на определенное количество шагов.
  2. Если шаги отрицательные, то сдвиг происходит влево, иначе - вправо.
  3. Если шаги равны нулю, то текущий элемент массива возвращается без изменений.
  4. В функции dump происходит вывод элементов массива на экран через заданный разделитель.
  5. В функции main создается тестовый массив из 10 элементов.
  6. Выводится содержимое тестового массива.
  7. Происходит сдвиг массива на 3 шага влево.
  8. Выводится содержимое сдвинутого массива.
  9. Происходит сдвиг массива на 2 шага вправо.
  10. Выводится содержимое сдвинутого массива.
  11. Происходит сдвиг массива на 1 шаг вперед.
  12. Выводится содержимое сдвинутого массива.
  13. Происходит сдвиг массива на 2 шага назад.
  14. Выводится содержимое сдвинутого массива.
  15. В конце программы выводится сообщение Одесский фольклёр.
  16. Программа возвращает 0, заканчивая свою работу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы