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#
using System; class GFG{ // Wrapper over the recursive function // leftRotateRec() // It left rotates []arr by d. public static void leftRotate(int []arr, int d, int n) { leftRotateRec(arr, 0, d, n); } public static void leftRotateRec(int []arr, int i, 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, i, n - d + i, d); return; } // If A is shorter if(d < n - d) { swap(arr, i, n - d + i, d); leftRotateRec(arr, i, d, n - d); } // If B is shorter else { swap(arr, i, d, n - d); // This is tricky leftRotateRec(arr, n - d + i, 2 * d - n, d); } } // UTILITY FUNCTIONS // Function to print an array public static void printArray(int []arr, int size) { int i; for(i = 0; i < size; i++) Console.Write(arr[i] + " "); Console.WriteLine(); } // This function swaps d elements // starting at index fi with d elements // starting at index si public static 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 public static void Main(String[] args) { int []arr = { 1, 2, 3, 4, 5, 6, 7 }; leftRotate(arr, 2, 7); printArray(arr, 7); } } // This code is contributed by amal kumar choubey
Producción:
3 5 4 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 static 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; } } /*Finally, block swap A and B*/ swap(arr, d-i, d, i); } // This code is contributed by Rajput-Ji
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