Функция сдвига массива - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, есть задача - нужно написать функцию, которая сдвигает массив array[] размером size на shift элементов. соответственно, чтобы двигать вправо shift больше нуля, а влево наоборот. под буфер в цикле нельзя выделять целый массив, можно только одну переменную, тоесть нужно максимально оптимизировать использование памяти. сложность алгоритма не должна превышать O(N). не пишите пожалуйста код, помогите с логикой задачи. Раньше я делал вот так -
Листинг программы
  1. #include <stdio.h>
  2. void arrayShift(int array[], int size, int shift) {
  3. int temp[size];
  4. int i;
  5. for ( i = 0; i < size; i++ ) {
  6. temp[( i + shift ) % size] = array[i];
  7. }
  8. for (i = 0; i < size; i++) {
  9. array[i] = temp[i];
  10. }
  11. }
но требованиям задачи это не отвечало, сейчас ищу более оптимальный вариант. ткните носом в ошибки меня говнокодера. спасибо (-:

Решение задачи: «Функция сдвига массива»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int * rotate_array(int * array, const size_t count, const int steps) {
  5.     if ( steps < 0 ) {
  6.         int tmp = *array;
  7.         memmove(array, array + 1, sizeof(int) * (count - 1));
  8.         array[count - 1] = tmp;
  9.         return rotate_array(array, count, steps + 1);
  10.     }
  11.     else if ( steps > 0 ) {
  12.         int tmp = array[count - 1];
  13.         memmove(array + 1, array, sizeof(int) * (count - 1));
  14.         *array = tmp;
  15.         return rotate_array(array, count, steps - 1);
  16.     }
  17.     else
  18.         return array;
  19. }
  20.  
  21. void dump(const int * array, size_t count) {
  22.     while ( count-- )
  23.         printf("%d%c", *array++, ( count ) ? ' ' : '\n');
  24. }
  25.  
  26. #define SIZE (10)
  27.  
  28. int main(void) {
  29.     int arr[SIZE] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  30.    
  31.     dump(arr, SIZE);
  32.    
  33.     /* три шаги налево */
  34.     dump(rotate_array(arr, SIZE, -3), SIZE);
  35.     /* две шаги направо */
  36.     dump(rotate_array(arr, SIZE, 2), SIZE);
  37.     /* шаг вперёд */
  38.     dump(rotate_array(arr, SIZE, -1), SIZE);
  39.     /* и две назад */
  40.     dump(rotate_array(arr, SIZE, 2), SIZE);
  41.     /* (c) Одесский фольклёр */
  42.    
  43.     return 0;
  44. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы