Número de pasos para ordenar la array cambiando el orden de tres elementos en cada paso

Dada una array arr[] de tamaño N que consta de elementos únicos en el rango [0, N-1] , la tarea es encontrar K , que es el número de pasos necesarios para ordenar la array dada seleccionando tres elementos distintos y reorganizándolos . Y también, imprimir los índices seleccionados en esos K pasos en K líneas. 
 

Por ejemplo, en la array {5, 4, 3, 2, 1, 0}, una forma posible de ordenar la array dada seleccionando tres elementos distintos es seleccionar los números {2, 1, 0} y ordenarlos como { 0, 1, 2} haciendo así la array {5, 4, 3, 0, 1, 2}. De manera similar, se realizan las operaciones restantes y los índices seleccionados ({3, 4, 5} en el caso anterior) se imprimen en líneas separadas. 
 

Ejemplos: 
 

Entrada: arr[] = {0, 5, 4, 3, 2, 1} 
Salida: 

1 2 5 
2 5 4 
Explicación: 
La array anterior se puede ordenar en 2 pasos: 
Paso I: Cambiamos el orden de los elementos en índices 1, 2, 5 entonces la array se convierte en {0, 1, 5, 3, 2, 4}. 
Paso II: Nuevamente cambiamos el orden de los elementos en los índices 2, 5, 4, luego la array se convierte en {0, 1, 2, 3, 4, 5} que se ordena.
Entrada: arr[] = {0, 3, 1, 6, 5, 2, 4} 
Salida: -1 
Explicación: 
La array anterior no se puede ordenar en ningún número de pasos. 
Supongamos que elegimos los índices 1, 3, 2 y luego la array se convierte en {0, 1, 6, 3, 5, 2, 4} 
Después de eso, elegimos los índices 2, 6, 4 y luego la array se convierte en {0, 1, 5, 3, 4, 2, 6}. 
Ahora solo quedan dos elementos sin ordenar, por lo que no podemos elegir 3 elementos, por lo que la array anterior no se puede ordenar. Podemos probar con cualquier orden de índices y siempre nos quedarán 2 elementos sin clasificar. 
 

Enfoque: La idea es primero contar los elementos que no están ordenados e insertarlos en un conjunto desordenado . Si el conteo es 0, entonces no necesitamos ningún número de pasos para ordenar la array, así que imprimimos 0 y salimos. De lo contrario, primero borramos todos los elementos del conjunto para los cuales i = A[A[i]] y luego realizamos la siguiente operación hasta que el conjunto se vacía: 
 

  • Seleccionamos todas las combinaciones posibles de índices (si están disponibles) de modo que se ordenen un mínimo de dos elementos.
  • Ahora, cambia el orden de los elementos y bórralos del conjunto si i = A[i].
  • Entonces, nos quedan solo aquellos elementos tales que i = A[A[i]] y la cuenta de ellos debe ser un múltiplo de 4, de lo contrario no es posible ordenar los elementos.
  • Luego, elegimos dos pares cualquiera y cambiamos el orden de los elementos dos veces. Luego, los cuatro elementos elegidos se ordenarán.
  • Almacenamos todos los índices que están involucrados en el cambio de orden de los elementos en un vector y lo imprimimos como respuesta.

Entendamos el enfoque anterior con un ejemplo. Sea el arreglo arr[] = {0, 8, 9, 10, 1, 7, 12, 4, 3, 2, 6, 5, 11}. Después: 
 

  • Inicialmente, el conjunto contendrá los 12 elementos y no hay elementos tales que i = A[A[i]].
  • Ahora, se eligen {11, 5, 7} y se cambia el orden de los elementos. Entonces, arr[] = {0, 8, 9, 10, 1, 5, 12, 7, 3, 2, 6, 4, 11}.
  • Ahora, se eligen {11, 4, 1} y se cambia el orden de los elementos. Entonces, arr[] = {0, 1, 9, 10, 4, 5, 12, 7, 3, 2, 6, 8, 11}.
  • Ahora, se eligen {11, 8, 3} y se cambia el orden de los elementos. Entonces, arr[] = {0, 1, 9, 3, 4, 5, 12, 7, 8, 2, 6, 10, 11}.
  • Ahora, se eligen {11, 10, 6} y se cambia el orden de los elementos. Entonces, arr[] = {0, 1, 9, 3, 4, 5, 6, 7, 8, 2, 10, 12, 11}.
  • Después del paso anterior, nos quedan dos pares de elementos desordenados tales que i = A[A[i]].
  • Finalmente, se eligen y reordenan {2, 11, 9} y {11, 9, 5}. Luego, arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} que se ordena.

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

CPP

// C++ program to sort the array
// by changing the order of
// three elements
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to change the order of
// the elements having a temporary
// vector and the required indices
// as the arguments
void cngorder(vector<int>& v, int i,
              int j, int k)
{
    int temp = v[k];
    v[k] = v[j];
    v[j] = v[i];
    v[i] = temp;
}
 
// Function to sort the elements having
// the given array and its size.
void sortbyorder3(vector<int>& A, int n)
{
 
    // Flag to check whether the sorting
    // is possible or not
    bool flag = 0;
 
    int count = 0;
 
    // Set that will contains unsorted
    // elements
    unordered_set<int> s;
 
    // Iterating through the elements
    for (int i = 0; i < n; i++) {
 
        // Inserting the required elements
        // in the set
        if (i != A[i])
            count++, s.insert(i);
    }
 
    // When the given array is
    // already sorted
    if (count == 0)
        cout << "0" << endl;
 
    else {
 
        // Vector that will contain
        // the answer
        vector<vector<int> > ans;
 
        // Temporary vector to store
        // the indices
        vector<int> vv;
 
        int x, y, z;
 
        count = 0;
 
        // Loop that will execute till the
        // set becomes empty
        while (!s.empty()) {
            auto it = s.begin();
            int i = *it;
 
            // Check for the condition
            if (i == A[A[i]]) {
                s.erase(i);
                s.erase(A[i]);
                continue;
            }
 
            // Case when the minimum two
            // elements will get sorted
            else {
                x = A[i], y = A[A[i]], z = A[A[A[i]]];
                vv.push_back(x), vv.push_back(y),
                    vv.push_back(z);
 
                // Changing the order of elements
                cngorder(A, x, y, z);
 
                // Pushing the indices to the
                // answer vector
                ans.push_back(vv);
 
                // If the third element also
                // gets sorted
                if (vv[0] == A[vv[0]])
                    s.erase(vv[0]);
 
                // Erasing the two sorted elements
                // from the set
                s.erase(vv[1]), s.erase(vv[2]);
                vv.clear();
            }
        }
 
        count = 0;
 
        // The count of the remaining
        // unsorted elements
        for (int i = 0; i < n; i++) {
            if (i != A[i])
                count++;
        }
 
        // If the count of the left
        // unsorted elements is not
        // a multiple of 4, then
        // sorting is not possible
        if (count % 4 != 0)
            flag = 1;
 
        // Only the elements such that
        // i = A[A[i]] are left
        // for sorting
        else {
 
            // Indices of any one element
            // from the two pairs that
            // will be sorted in 2 steps
            int i1 = -1, i2 = -1;
            for (int i = 0; i < n; i++) {
 
                // Index of any element of
                // the pair
                if (A[i] != i && i1 == -1) {
                    i1 = i;
                }
 
                // When we find the second
                // pair and the index of
                // any one element is stored
                else if (A[i] != i && i1 != -1
                         && i2 == -1) {
                    if (i1 == A[i])
                        continue;
                    else
                        i2 = i;
                }
 
                // When we got both the pair
                // of elements
                if (i1 != -1 && i2 != -1) {
 
                    // Remaining two indices
                    // of the elements
                    int i3 = A[i1], i4 = A[i2];
 
                    // The first order of indices
                    vv.push_back(i1),
                        vv.push_back(i2),
                        vv.push_back(A[i1]);
 
                    // Pushing the indices to the
                    // answer vector
                    ans.push_back(vv);
                    vv.clear();
 
                    // The second order of indices
                    vv.push_back(i2),
                        vv.push_back(A[i1]),
                        vv.push_back(A[i2]);
 
                    // Pushing the indices to the
                    // answer vector
                    ans.push_back(vv);
                    vv.clear();
 
                    // Changing the order of the
                    // first combination of
                    // the indices
                    cngorder(A, i1, i2, i3);
 
                    // Changing the order of the
                    // second combination of
                    // the indices after which all
                    // the 4 elements will be sorted
                    cngorder(A, i2, i3, i4);
 
                    i1 = -1, i2 = -1;
                }
            }
        }
 
        // If the flag value is 1
        // the sorting is not possible
        if (flag == 1)
            cout << "-1" << endl;
 
        else {
 
            // Printing the required number
            // of steps
            cout << ans.size() << endl;
 
            // Printing the indices involved
            // in the shifting
            for (int i = 0; i < ans.size(); i++) {
                cout << ans[i][0]
                     << " " << ans[i][1]
                     << " " << ans[i][2]
                     << endl;
            }
        }
    }
}
 
// Driver code
int main()
{
 
    int n;
    vector<int> A{ 0, 8, 9, 10, 1, 7, 12,
                   4, 3, 2, 6, 5, 11 };
    n = A.size();
 
    // Calling the sorting function
    sortbyorder3(A, n);
 
    return 0;
}
Producción: 

6
11 5 7
11 4 1
11 8 3
11 10 6
2 11 9
11 9 12

 

Complejidad de tiempo: O(N) , donde N es el tamaño de la array.
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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