Escribe una función rotar(ar[], d, n) que gire arr[] de tamaño n por d elementos.
La rotación de la array anterior por 2 hará que la array
Algoritmo:
Initialize A = arr[0..d-1] and B = arr[d..n-1] 1) Do following until size of A is equal to size of B a) If A is shorter, divide B into Bl and Br such that Br is of same length as A. Swap A and Br to change ABlBr into BrBlA. Now A is at its final place, so recur on pieces of B. b) If A is longer, divide A into Al and Ar such that Al is of same length as B Swap Al and B to change AlArB into BArAl. Now B is at its final place, so recur on pieces of A. 2) Finally when A and B are of equal size, block swap them.
Implementación recursiva:
C++
#include <bits/stdc++.h> using namespace std; /*Prototype for utility functions */ void printArray(int arr[], int size); void swap(int arr[], int fi, int si, int d); void leftRotate(int arr[], int d, int n) { /* Return If number of elements to be rotated is zero or equal to array size */ if(d == 0 || d == n) return; /*If number of elements to be rotated is exactly half of array size */ if(n - d == d) { swap(arr, 0, n - d, d); return; } /* If A is shorter*/ if(d < n - d) { swap(arr, 0, n - d, d); leftRotate(arr, d, n - d); } else /* If B is shorter*/ { swap(arr, 0, d, n - d); leftRotate(arr + n - d, 2 * d - n, d); /*This is tricky*/ } } /*UTILITY FUNCTIONS*/ /* function to print an array */ void printArray(int arr[], int size) { int i; for(i = 0; i < size; i++) cout << arr[i] << " "; cout << endl; } /*This function swaps d elements starting at index fi with d elements starting at index si */ void swap(int arr[], int fi, int si, int d) { int i, temp; for(i = 0; i < d; i++) { temp = arr[fi + i]; arr[fi + i] = arr[si + i]; arr[si + i] = temp; } } // Driver Code int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7}; leftRotate(arr, 2, 7); printArray(arr, 7); return 0; } // This code is contributed by rathbhupendra
3 4 5 6 7 1 2
Complejidad de tiempo: O(N), donde N representa el tamaño de la array dada.
Espacio auxiliar: O(N), debido al espacio de pila recursivo.
Implementación iterativa:
aquí hay una implementación iterativa del mismo algoritmo. Aquí se utiliza la misma función de utilidad swap().
C++
// C++ code for above implementation void leftRotate(int arr[], int d, int n) { int i, j; if (d == 0 || d == n) return; i = d; j = n - d; while (i != j) { if (i < j) /*A is shorter*/ { swap(arr, d - i, d + j - i, i); j -= i; } else /*B is shorter*/ { swap(arr, d - i, d, j); i -= j; } // printArray(arr, 7); } /*Finally, block swap A and B*/ swap(arr, d - i, d, i); } // This code is contributed by Shivani
Complejidad de tiempo: O(N), donde N representa el tamaño de la array dada.
Espacio auxiliar: O(1), no se requiere espacio adicional, por lo que es una constante.
Consulte las siguientes publicaciones para conocer otros métodos de rotación de arrays:
https://www.geeksforgeeks.org/array-rotation/
https://www.geeksforgeeks.org/program-for-array-rotation-continued-reversal-algorithm/
Referencias:
http://www.cs.bell-labs.com/cm/cs/pearls/s02b.pdf
Escriba comentarios si encuentra algún error en los programas/algoritmos anteriores o si desea compartir información adicional sobre el intercambio de bloques algoritmo.
Consulte el artículo completo sobre el algoritmo de intercambio de bloques para la rotación de arrays para obtener más detalles.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA