La ordenación por burbujas también se conoce como Sinking Sort. Es un algoritmo de ordenación simple que recorre repetidamente la lista que hay que ordenar, comparando cada par de elementos adyacentes y los intercambia si están en el orden equivocado.

Este procedimiento se repite hasta que no se realicen intercambios.

Como al menos un elemento se mueve a su lugar final en cada pasada, podemos decrementar la última posición comprobada en cada pasada.

La siguiente animación muestra cómo funciona la ordenación por burbujas:

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. Puedes intentar resolverlo con el método de clasificación por burbujas.

Variations

La versión original de Donald Knuth es un poco más sencilla, pero la idea es la misma: comparamos elementos adyacentes y los intercambiamos si es necesario.

void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void bubble_sort(int* lst, int size) {
    for(int i=size-1; i > 0; i--)
        for(int j=0; j < i;j++)
            if (lst[j+1] < lst[j]){
                swap(&lst[j],&lst[j+1]);
            }
}

Sin embargo, este código tiene la desventaja de que siempre realiza el mismo número de operaciones, independientemente de la matriz de entrada. La siguiente implementación se detiene en cuanto ha realizado una ejecución sin ninguna permutación. Esta es la más común hoy en día.

Todavía podemos mejorarlo un poco porque, si en una iteración el último intercambio se hizo en la posición N, entonces todos los elementos situados después de esta posición N están en el orden correcto. Así, para las siguientes iteraciones, es inútil volver a explorarlos. Tendríamos entonces algo así:

void bubble_sort1(int* lst, int size)
{
    int swapped = 1;
    int lastswap = size ;
    int j;
    while (swapped) {
        swapped = 0;
        for (j=0;j<lastswap - 1;j++) {
            if (lst[j]>lst[j+1]){
                swapped = j+1;
                swap(&lst[j],&lst[j+1]);
            }
        }
        lastswap = swapped;
    }
}

Complejidad

Desde el punto de vista educativo, este algoritmo es muy interesante. Es fácil de entender y, por tanto, también de explicar. Es fácil de codificar en la mayoría de los lenguajes informáticos y ofrece la posibilidad de manipular vectores o listas. Puede utilizarse como base para muchos ejercicios de optimización. Y tiene un nombre pegadizo.

Pero, en el mundo real, hay que decir que no es muy eficiente. A menudo se critica, incluso se considera “ingenua” y “debe evitarse absolutamente”. Sin embargo, tiene el mérito de ser suficientemente eficiente en listas pequeñas o en listas que ya están parcialmente ordenadas.

En el peor de los casos, con los datos ordenados en sentido inverso, las ejecuciones sucesivas de la tabla requieren (n2 - n) / 2 intercambios. Por ejemplo, para una lista de 10 elementos, se necesitarán, en el peor de los casos, 45 comparaciones y 45 intercambios [ (102 - 10) / 2 ]. La complejidad es por tanto cuadrática, del orden O(n2).

Cuando el orden inicial de los elementos a clasificar es aleatorio, se considera que serán necesarios (n2 - n) / 4 intercambios. Por lo tanto, la complejidad será también O(n2).

En el mejor de los casos, cuando la lista ya está ordenada, se necesitarán (n - 1) comparisons and no permutations. comparaciones y ninguna permutación. La complejidad es lineal, en O(n).

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ño de datos Comparaciones Intercambios Total

Para tener una idea más concreta del rendimiento de este algoritmo, suponga que tiene que ordenar alfabéticamente el directorio de los habitantes de varias grandes ciudades. Y que la máquina que tiene a su disposición puede realizar, digamos, diez millones de instrucciones por segundo . Se puede estimar el tiempo necesario para esta clasificación.


Ciudad Población Duración estimada
Chicoutimi 69 004
Bruselas 174 383
Paris 2 220 445
Madrid 3 207 247
Berlín 3 520 031
Toronto 6 555 205
Londres 8 416 535
Mexico 20 879 830
El Cairo 24 439 785
Delhi 26 454 086
Jacarta 35 143 473
Sao Paulo 36 315 271
Tokio 42 796 714


Comics Strip