Rotar array en C: ejercicio resuelto

Rotar array en C: ejercicio resuelto

Si buscas rotar array en C ejercicio resuelto, aquí tienes el algoritmo de tres reversiones (three-reversal trick): rota un array k posiciones a la izquierda o a la derecha en O(n) tiempo y O(1) espacio extra, sin necesitar un buffer auxiliar.

La idea es que rotar un array equivale a invertir tres subsecuencias: el bloque que se desplaza, el resto y luego todo el array.

Enunciado

Dado el array {1, 2, 3, 4, 5, 6, 7}:

  1. Rótalo 3 posiciones a la izquierda{4, 5, 6, 7, 1, 2, 3}.
  2. Rótalo 2 posiciones a la derecha{6, 7, 1, 2, 3, 4, 5}.

Usa el algoritmo de tres reversiones en ambos casos.

Solución en C

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>

void invertir(int arr[], int ini, int fin) {
    while (ini < fin) {
        int tmp = arr[ini];
        arr[ini++] = arr[fin];
        arr[fin--] = tmp;
    }
}

/* Rotación a la izquierda k posiciones */
void rotar_izquierda(int arr[], int n, int k) {
    k %= n;
    if (k == 0) return;
    invertir(arr, 0, k - 1);
    invertir(arr, k, n - 1);
    invertir(arr, 0, n - 1);
}

/* Rotación a la derecha k posiciones */
void rotar_derecha(int arr[], int n, int k) {
    k %= n;
    if (k == 0) return;
    invertir(arr, 0, n - 1);
    invertir(arr, 0, k - 1);
    invertir(arr, k, n - 1);
}

void imprimir(const int arr[], int n) {
    for (int i = 0; i < n; i++) printf("%d ", arr[i]);
    printf("\n");
}

int main(void) {
    int a[] = {1, 2, 3, 4, 5, 6, 7};
    int b[] = {1, 2, 3, 4, 5, 6, 7};

    rotar_izquierda(a, 7, 3);
    printf("Rotar izquierda 3: "); imprimir(a, 7);

    rotar_derecha(b, 7, 2);
    printf("Rotar derecha 2:   "); imprimir(b, 7);

    return 0;
}

Resultado esperado

1
2
Rotar izquierda 3: 4 5 6 7 1 2 3 
Rotar derecha 2:   6 7 1 2 3 4 5 

Errores frecuentes

  • No reducir k con k %= n: si k >= n se intentan acceder índices fuera del array al calcular k - 1.
  • Confundir izquierda con derecha: rotar a la izquierda k posiciones es equivalente a rotar a la derecha n - k posiciones.
  • Usar un buffer auxiliar de tamaño k: correcto en funcionalidad pero usa O(k) espacio extra; el algoritmo de tres reversiones es O(1).
  • Invertir los índices incorrectamente: los tres rangos deben ser [0, k-1], [k, n-1] y [0, n-1] para la rotación izquierda, en ese orden.

Aplicación práctica

La rotación de arrays se usa en buffers circulares, en la implementación de colas FIFO con array, en el procesamiento de señales (desplazamiento de ventanas) y en problemas de texto como la rotación de cadenas para detectar anagramas de rotación.

Siguiente ejercicio recomendado

Práctica guiada y libro completo

Si quieres una ruta completa con progresión real de dificultad:

FAQ

¿Por qué el algoritmo de tres reversiones funciona?

Rotar a la izquierda k posiciones transforma [A|B] en [B|A]. Si invertimos A[A'|B], luego invertimos B[A'|B'] y finalmente invertimos todo → [B|A]. Las tres inversiones in-place logran la rotación sin copias.

¿Cómo manejar k mayor que n?

Con k %= n. Rotar n posiciones equivale a no rotar. Con el módulo, k = 9 en un array de 7 elementos equivale a k = 2.

¿Es posible rotar una cadena con el mismo algoritmo?

Sí. Una cadena en C es un array de char, por lo que invertir y rotar_izquierda funcionan exactamente igual sustituyendo int por char y pasando strlen(s) como n.