El ordenamiento de burbuja bidireccional es una mejora de la ordenación en burbujas. Se utiliza principalmente como herramienta educativa.

Intenta mitigar un defecto de la clasificación por burbujas: el problema de los conejos y las tortugas. Se trata de una situación en la que se coloca una burbuja pesada al final de la matriz. Mientras las burbujas ligeras (conejos) ascienden rápidamente, la burbuja pesada (tortuga) desciende sólo una posición por cada iteración.

Este algoritmo acelerará las tortugas cambiando de dirección en cada iteración. Así, con cada cambio de dirección, los “conejos” se convierten en “tortugas” y viceversa. Esto no sólo permite que los elementos más grandes migren rápidamente al final de la lista, sino que también permite que los elementos más pequeños migren más rápido al principio.

La siguiente animación muestra cómo funciona el algoritmo:

Trabajo práctico

El minijuego que se presenta a continuación permite intentar clasificar, en orden de peso creciente, 5 barriles, con una balanza Roberval para compararlos.

Distintas variantes

La versión más común de este algoritmo se compone de dos bucles anidados.


void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void shakersort(int vect[], int size) {
    int step, current;
    for (step = 1; step <= size / 2; step++)
    {
        for (current = step - 1; current < size - step; current++)
            if (vect[current] > vect[current+1])
                swap(&vect[current], &vect[current + 1]);
        for (current = size - step - 1; current >= step; current--)
            if (vect[current] < vect[current-1])
                swap(&vect[current], &vect[current - 1]);
    }
}

Pero prefiero una versión con un solo bucle y un cambio de dirección.

Rendimiento

El ordenamiento de burbuja bidireccional no es mucho más eficiente que el ordenamiento de burbuja convencional.

En el caso desfavorable, con un arreglo ordenado en orden inverso, realizará un número de intercambios de (n2 - n) / 2. Por ejemplo, para una lista de 10 elementos se necesitarán 45 comparaciones y 45 intercambios [ (102 - 10) / 2 ]. El número de comparaciones o de intercambios en el caso más desfavorable pertenece al orden O(n2).

En el caso óptimo, con un arreglo ya ordenado, realizará un número de comparaciones de (n - 1). El número de comparaciones en el caso más favorable pertenece al orden de O(n).

En el caso promedio realizará un número de comparaciones de (n2 - 2*n) / 4, sólo un poco mejor que el ordenamiento de burbuja convencional.

La animación siguiente permite comprobar, de forma empírica, esta evolución del número de operaciones en función del número de elementos a ordenar.

Tamaños de datos Comparaciones Intercambios Total

Para tener una idea más concreta del rendimiento de este algoritmo, he aquí los tiempos que serían necesarios para ordenar la lista de habitantes de algunas grandes ciudades :


Ciudad Población Duración estimada
Paimpol (Bretaña, Francia) 7 172
Helsinki 631 695
Denver 705 576
Estocolmo 975 551
Berlín 3 520 031
Nairobi 4 734 881
Barcelona 5 407 264
Río 6 718 000
Moscú 12 655 050
Lagos 22 829 561
Shanghai 24 870 895
Seúl 26 000 782
Manila 28 644 207
Tokio 42 796 714

Comic Strip