Ordenación de burbujas
20-11-2021
Animación del algoritmo de clasificación de burbujas
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 |