Programa C# para el algoritmo de intercambio de bloques para la rotación de arrays

Escribe una función rotar(ar[], d, n) que gire arr[] de tamaño n por d elementos. 

Array

La rotación de la array anterior por 2 hará que la array

ArrayRotation1

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *