Ordenamiento de panqueques

Harshit Jindal 12 octubre 2023
  1. Algoritmo de ordenamiento de panqueques
  2. Ejemplo de ordenamiento de panqueques
  3. Implementación del algoritmo ordenamiento de panqueques
  4. Complejidad del algoritmo ordenamiento de panqueques
Ordenamiento de panqueques

La ordenamiento de panqueques es un algoritmo de ordenación basado en la inversión. Se basa en el problema de la vida real de asemejar panqueques en un plato con la ayuda de una espátula. Recibe su nombre de la operación de volteo utilizada en el algoritmo, análoga a la de voltear panqueques. A diferencia de la mayoría de los algoritmos de ordenación que tratan de minimizar el número de comparaciones requeridas para realizar la ordenación, éste trata de ordenar el array en el mínimo de reversiones. Al igual que ordenamiento por selección, también coloca el elemento máximo al final.

Algoritmo de ordenamiento de panqueques

Supongamos que tenemos un array sin ordenar A[] que contiene n elementos.

PancakeSort()

  • Inicializa el tamaño de la subarray sin ordenar como curr = n-1 y reduce iterativamente su tamaño en 1.
  • Encuentra el índice del elemento máximo mi en la subarray sin ordenar.
  • Voltea A[0, ... , mi] usando flip(A,mi) para mover el elemento máximo A[i] al índice 0.
  • Voltea A[0, ... , i] usando flip(A,i) para mover el elemento máximo A[i] en su posición correcta.

Flip()

  • Intercambia el elemento del primer índice f con el del último índice e.
  • Incrementa f y decrementa e.
  • Repite los pasos anteriores hasta que f <= e.

Ejemplo de ordenamiento de panqueques

Supongamos que tenemos el array (3, 5, 2, 1, 7, 6, 4). Vamos a ordenarlo utilizando el algoritmo de ordenamiento de panqueques.

  • Primera iteración

mi = 4, curr = 7

Flip(mi) [7, 1, 2, 5, 3, 6, 4]
Flip(6) [ 4, 6, 3, 5, 2, 1, 7]
  • Segunda iteración

mi = 1, curr = 6

Flip(mi) [6, 4, 3, 5, 2, 1, 7]
Flip(5) [1, 2, 5, 3, 4, 6, 7]
  • Tercera iteración

mi = 2, curr = 5

Flip(mi) [5, 2, 1, 3, 4, 6, 7]
Flip(4) [4, 3, 1, 2, 5, 6, 7]
  • Cuarta iteración

mi = 0, curr = 4

Flip(mi) [4, 3, 1, 2, 5, 6, 7]
Flip(3) [2, 1, 3, 4, 5, 6, 7]
  • Quinta iteración

mi = 2, curr = 3

Flip(mi) [3, 1, 2, 4, 5, 6, 7]
Flip(2) [2, 1, 3, 4, 5, 6, 7]
  • Sexta iteración

mi = 0, curr = 2

Flip(mi) [2, 1, 3, 4, 5, 6, 7]
Flip(1) [1, 2, 3, 4, 5, 6, 7]

Obtenemos el array ordenado final como 1, 2, 3, 4, 5, 6, 7.

Implementación del algoritmo ordenamiento de panqueques

#include <bits/stdc++.h>
using namespace std;
void flip(int arr[], int i) {
  int temp, start = 0;
  while (start < i) {
    temp = arr[start];
    arr[start] = arr[i];
    arr[i] = temp;
    start++;
    i--;
  }
}

int findMax(int arr[], int n) {
  int mi = 0;
  for (int i = 0; i < n; ++i)
    if (arr[i] > arr[mi]) mi = i;
  return mi;
}

void pancakeSort(int arr[], int n) {
  for (int i = n; i > 1; i--) {
    int mi = findMax(arr, i);
    if (mi != i - 1) {
      flip(arr, mi);
      flip(arr, i - 1);
    }
  }
}
int main() {
  int n = 6;
  int arr[6] = {5, 3, 4, 2, 1, 6};
  cout << "Input arr: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
  pancakeSort(arr, n);  // Sort elements in ascending order
  cout << "Output arr: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
}

Complejidad del algoritmo ordenamiento de panqueques

Complejidad temporal

  • Caso medio

En promedio, se realizan n-i comparaciones en la i-th pasada de la ordenamiento de panqueques. Por tanto, si hay n iteraciones, la complejidad temporal media puede venir dada por :

(n-1) + (n-2) + (n-3) + ... + 1 = n*(n-1)/2

Por lo tanto, la complejidad temporal es del orden de [Big Theta]: O(n2). También se puede calcular contando el número de bucles. Hay un total de dos bucles de n iteraciones haciendo la complejidad: n*n = n2.

  • El peor caso

El peor caso se produce cuando los elementos son alternativamente pequeños y grandes. Se requiere un total de 2n-3 volteos. El número de vueltas necesarias es del orden de O(n). La complejidad temporal en el peor de los casos es [Big O] O(n2).

  • El mejor caso

El mejor caso se da cuando el array ya está ordenado y no se requiere ningún volteo. La complejidad temporal del mejor caso es [Big Omega]: O(n).

Complejidad espacial

La complejidad espacial de este algoritmo es O(n) porque no se necesita más memoria que una variable temporal.

Harshit Jindal avatar Harshit Jindal avatar

Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.

LinkedIn

Artículo relacionado - Sort Algorithm