Ordenamiento de panqueques
- Algoritmo de ordenamiento de panqueques
- Ejemplo de ordenamiento de panqueques
- Implementación del algoritmo ordenamiento de panqueques
- Complejidad del algoritmo 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 en1
. -
Encuentra el índice del elemento máximo
mi
en la subarray sin ordenar. -
Voltea
A[0, ... , mi]
usandoflip(A,mi)
para mover el elemento máximoA[i]
al índice0
. -
Voltea
A[0, ... , i]
usandoflip(A,i)
para mover el elemento máximoA[i]
en su posición correcta.
Flip()
-
Intercambia el elemento del primer índice
f
con el del último índicee
. -
Incrementa
f
y decrementae
. -
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 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