Verifique si una array decreciente se puede ordenar usando el desplazamiento cíclico triple

Dado un arr[] de tamaño N cuyos elementos están ordenados en orden descendente. La tarea es encontrar si la array dada se puede clasificar en orden ascendente realizando un número mínimo de intercambios a la derecha cíclicos triples. Imprima los índices involucrados en cada uno de los intercambios de derechos cíclicos triples.

Triple cíclico a la derecha se refiere al triple cíclico a la derecha en el que: 
 

arr[i] -> arr[j] -> arr[k] -> arr[i], donde 0 <= i, j, k < N e i, j y k deben ser diferentes.

 

Nota: Los siguientes ejemplos tienen indexación basada en 1. 
Ejemplos: 

Entrada: arr[] = {100, 90, 80, 70, 60} 
Salida: SI 

[1 2 5] 
[2 5 4] 
Explicación: 
Para la primera operación los índices elegidos son 1, 2 y 5
arr[1] = arr[5] = 60
arr[2] = arr[1] = 100
arr[5] = arr[2] = 90
La array actualizada después del primer desplazamiento cíclico a la derecha es {60 100 80 70 90}
Para la primera operación los índices elegidos son 2, 5 y 4
arr[2] = arr[4] = 70
arr[5] = arr[2] = 100
arr[4] = arr[5] = 90
La array actualizada después del segundo desplazamiento cíclico a la derecha es {60 70 80 90 100}
Así la array está ordenada por solo 2 operaciones cíclicas de intercambio a la derecha.
Entrada: arr[] = {7, 6, 5, 4, 3, 2, 1} 
Salida: NO 
Explicación: 
No es posible realizar ninguna operación cíclica de desplazamiento a la derecha en esta array y, por lo tanto, no se puede clasificar en orden ascendente. 
 

Enfoque:
Se deben hacer las siguientes observaciones:

  • Para una array con 3 elementos, la respuesta es NO. Porque el elemento del medio está en su posición correcta y nos quedarán dos elementos, mientras que se necesitan tres elementos para el desplazamiento cíclico a la derecha.
  • Si (N % 4) == 0 o (N % 4) == 1 entonces es posible ordenar, de lo contrario no es posible ordenar. 
    Del enfoque anterior se puede ver que en cada dos desplazamientos cíclicos a la derecha se ordenan cuatro elementos.
  • Cuando N % 4 == 0 :
    Consideremos el arreglo [4 3 2 1]. Después de dos turnos para los índices 1 2 4 y 2 4 3 (en orden), la array se ordena como 1 2 3 4.
  • Cuando N % 4 == 1
    Se aplica el ejemplo 1 mencionado anteriormente que usa 5 elementos en la array. El elemento del índice 3 permanece como tal, mientras que los otros 4 elementos se ordenan en 2 desplazamientos cíclicos a la derecha.
  • Cuando N % 4 == 2
    no es posible ordenar la array ya que después de ordenar grupos de 4 elementos, finalmente quedarán 2 elementos en un orden incorrecto que nunca se podrá ordenar ya que para ordenar se necesitan exactamente 3 elementos.
  • Cuando N % 4 == 3
    No es posible ordenar la array después de grupos de 4 elementos, finalmente 3 elementos quedarán en un orden incorrecto que nunca podrá ordenarse ya que el elemento del medio de estos 3 elementos no ordenados permanece en su lugar. posición correcta desde el principio. Esto nos deja con 2 elementos que nunca se pueden ordenar, ya que para ordenar se necesitan exactamente 3 elementos.

Siga los pasos a continuación para resolver el problema.

  • Si el valor de N módulo 4 es 2 o 3, imprima NO .
  • Si el valor de N módulo 4 es 0 o 1 entonces,
    1. Imprimir
    2. Imprima el valor de piso (N / 2), ya que piso (N / 2) es el número de operaciones cíclicas de intercambio a la derecha que se van a realizar.
    3. Inicializar una variable K a 1.
    4. Las operaciones cíclicas de swap a la derecha solo se pueden realizar en pares. Los pares son [K, K+1, N] y [K+1, N, N-1]. Tan pronto como se impriman los pares, incremente el valor de K en 2 y disminuya el valor de N en 2.
    5. Continúe realizando el paso 4 hasta que se impriman todas las operaciones de piso (N/2) .

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
void sortarray(int arr[],int N)
{
     
    // If array is 3 2 1 can't
    // be sorted because 2 is in
    // its correct position, 1
    // and 3 can't shift right
    // because cyclic right shift
    // takes place between 3 elements
    if(N == 3)
        cout << "NO" << endl;
         
    // Check if its possible to sort
    else if(N % 4 == 0 || N % 4 == 1)
    {
        cout << "YES" << endl;
 
        // Number of swap is
        // N / 2 always
        // for this approach
        cout << (N / 2) << endl;
        int k = 1;
         
        // Printing index of the
        // cyclic right shift
        for(int l = 0; l < (N / 4); l++)
        {
        cout << k << " " << k + 1
                << " " << N << endl;
        cout << k + 1 << " " << N
                << " " << N - 1 << endl;
        k = k + 2;
        N = N - 2;
        }
    }
    else
        cout << "NO" << endl;
}
 
// Driver code
int main()
{
    int N = 5;
    int arr[] = { 5, 4, 3, 2, 1 };
     
    sortarray(arr, N);
    return 0;
}
 
// This code is contributed by divyeshrabadiya07

Java

// Java program for the above approach
class GFG{
     
static void sortarray(int arr[], int N)
{
     
    // If array is 3 2 1 can't
    // be sorted because 2 is in
    // its correct position, 1
    // and 3 can't shift right
    // because cyclic right shift
    // takes place between 3 elements
    if(N == 3)
    System.out.println("NO");
         
    // Check if its possible to sort
    else if(N % 4 == 0 || N % 4 == 1)
    {
        System.out.println("YES");
 
        // Number of swap is
        // N / 2 always
        // for this approach
        System.out.println(N / 2);
        int k = 1, l;
         
        // Printing index of the
        // cyclic right shift
        for(l = 0; l < (N / 4); l++)
        {
        System.out.println(k + " " + (k + 1) +
                               " " + N);
        System.out.println(k + 1 + " " +
                           N + " " + (N - 1));
        k = k + 2;
        N = N - 2;
        }
    }
    else
        System.out.println("NO");
}
 
// Driver code
public static void main (String []args)
{
    int N = 5;
    int arr[] = { 5, 4, 3, 2, 1 };
     
    sortarray(arr, N);
}
}
 
// This code is contributed by chitranayal

Python3

# Python3 program for the above approach
def sortarray(arr, N):
     
    # if array is 3 2 1 can't
    # be sorted because 2 is in
    # its correct position, 1
    # and 3 can't shift right
    # because cyclic right shift
    # takes place between 3 elements
    if(N == 3):
        print("NO")
         
    # check if its possible to sort
    elif(N % 4 == 0
        or N % 4 == 1):
        print("YES")
 
        # Number of swap is
        # N / 2 always
        # for this approach
        print(N // 2)
        k = 1
         
        # printing index of the
        # cyclic right shift
        for l in range(N // 4):
            print(k, k + 1, N)
            print(k + 1, N, N-1)
            k = k + 2
            N = N - 2
    else:
        print("NO")
         
# Driver code
if __name__ == "__main__":
     
    N = 5
    arr = [5, 4, 3, 2, 1]
    sortarray(arr, N)

C#

// C# program for the above approach
using System;
 
class GFG{
     
static void sortarray(int[] arr, int N)
{
     
    // If array is 3 2 1 can't
    // be sorted because 2 is in
    // its correct position, 1
    // and 3 can't shift right
    // because cyclic right shift
    // takes place between 3 elements
    if(N == 3)
        Console.WriteLine("NO");
     
    // Check if its possible to sort
    else if(N % 4 == 0 || N % 4 == 1)
    {
        Console.WriteLine("YES");
 
        // Number of swap is
        // N / 2 always
        // for this approach
        Console.WriteLine(N / 2);
        int k = 1;
     
        // Printing index of the
        // cyclic right shift
        for(int l = 0; l < (N / 4); l++)
        {
            Console.WriteLine(k + " " + (k + 1) +
                                  " " + N);
            Console.WriteLine(k + 1 + " " + N +
                                      " " + (N - 1));
            k = k + 2;
            N = N - 2;
        }
    }
    else
        Console.WriteLine("NO");
}
 
// Driver code
public static void Main()
{
    int N = 5;
    int []arr = { 5, 4, 3, 2, 1 };
 
    sortarray(arr, N);
}
}
 
// This code is contributed by sanjoy_62

Javascript

<script>
 
// Javascript program for the above approach
 
function sortarray(arr,N)
{
    // If array is 3 2 1 can't
    // be sorted because 2 is in
    // its correct position, 1
    // and 3 can't shift right
    // because cyclic right shift
    // takes place between 3 elements
    if(N == 3)
        document.write("NO<br>");
           
    // Check if its possible to sort
    else if(N % 4 == 0 || N % 4 == 1)
    {
        document.write("YES<br>");
   
        // Number of swap is
        // N / 2 always
        // for this approach
        document.write(Math.floor(N / 2)+"<br>");
        let k = 1, l;
           
        // Printing index of the
        // cyclic right shift
        for(l = 0; l < Math.floor(N / 4); l++)
        {
        document.write(k + " " + (k + 1) +
                               " " + N+"<br>");
        document.write(k + 1 + " " +
                           N + " " + (N - 1)+"<br>");
        k = k + 2;
        N = N - 2;
        }
    }
    else
        document.write("NO<br>");
}
 
// Driver code
let N = 5;
let arr=[ 5, 4, 3, 2, 1];
sortarray(arr, N);
 
 
// This code is contributed by avanitrachhadiya2155
</script>
Producción: 

YES
2
1 2 5
2 5 4

 

Complejidad temporal: O(N)
Espacio auxiliar: O(1)
 

Publicación traducida automáticamente

Artículo escrito por Versus 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 *