10 de julio de 2012 CLASE 30/6/2012 ORDENAMIENTO BURBUJA ( BUBBLE SORT) Ordenación de burbuja (Bubble Sort en inglés) es un sencillo algoritmo de ordenamiento. Es decir, nos permite colocar los datos en un orden particular, como orden ascendente o descendente. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos de posición si están en el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten más intercambios, lo cual significa que la lista está ordenada. Este algoritmo obtiene su nombre de la forma con la que suben por la lista los elementos durante los intercambios, como si fueran pequeñas "burbujas". También es conocido como el método del intercambio directo. Dado que solo usa comparaciones para operar elementos, se lo considera un algoritmo de comparación, siendo el más sencillo de implementar. COMO ORDENAR DATOS: Una manera simple de expresar el ordenamiento de burbuja en pseudocódigo es la siguiente Este algoritmo realiza el ordenamiento de una lista a de n valores, en este caso de n términos numerados del 0 al n-1, es decir de n=5 y va a estar enumerado de 0 a 4, consta de dos bucles (for) anidados uno con el índice i, y un segundo bucle con el índice j, con un recorrido desde 0 hasta n-1, para cada iteración del primer bucle que indica el lugar de la burbuja. La burbuja son dos términos de la lista seguidos, j y j+1, que se comparan, si el primero es menor que el segundo sus valores se intercambian. Para comprender el funcionamiento, un ejemplo sencillo Void burbuja (int a[ ], int n){ for (i=1; i<n-1; i++){ for (j=0 ; j<n - 1; j++){ if (a[j] > a[j+1]) /* son dos términos de la lista seguidos, j y j+1, que se comparan, si el primero es menor que el segundo sus valores se intercambian*/ intercambio(&a[j],&a[j-1]); } } Void intercambio(int&a,int&b) { int aux; aux=a; a=b; b=aux; } /*El intercambio no se puede ejecutar con solo 2 asignaciones, la variable aux almacena en forma temporal uno de los valores en intercambio, si se usaran 2 al comparar uno con otro, uno de ellos se perdería, por ejemplo, si a[i] es 7 y a[i+1]es 5, después de la primera asignación ambos valores serán 5 y se perdería el 7 . de ahí la necesidad de la variable aux. ADRIANA BONJOUR-- VIRGINIA URÍA Página 1 10 de julio de 2012 CLASE 30/6/2012 Por ejemplo tenemos una lista de números que hay que ordenar: a={8,5, -4, 3 , 1} Podemos ver que la lista tiene cinco términos,: n=5 El índice i hará un recorrido de 0 hasta n: Para i←0 hasta n-1 hacer Que en este caso será de 0 a 4. Para cada uno de los valores de i, j tomara sucesivamente los valores de 0 hasta n-1(4) Para j ← 0 hasta n-1 hacer Para cada valor de j, obtenido en ese orden, se compara el valor del índice j con el siguiente: Si a(j) > a(j+1) entonces Si el termino j es mayor que el término j+1, los valores se permutan, en caso contrario se continúa con la iteración. Para el caso del ejemplo, tenemos que n=5 Para la primera iteración del primer bucle: i= 0 j tomara los valores de 0 hasta 4: para j ←0 hasta 4 hacer Cuando j vale 0, se comparan a[0] con a[1] el 8 y el 5, dado que 8 > 5 se permuta el orden. Ahora j vale 1 y se comparan a[1] con a[2] el 8 y el -4 Como 8 > -4, se permutan, Ahora j vale 2 y se comparan a[2] con a[3] el 8 y el 3, Como 8 > 3, se permutan, Ahora j vale 3 y se comparan a[3] con a[4] el 8 y el 1, Como 8 > 1, se permutan, dando lugar a una nueva lista. Se repite el proceso hasta que j valga 4, dando Lugar a una lista parcialmente ordenada, podemos ver que el termino de mayor valor esta en el último lugar. Ahora i vale 1, y j hará un recorrido de 0 a 4. Primero j vale 0, se comparan a[0] con a[1], el 5 y el -4, como 5 > -4 se permutan dando lugar a la nueva lista. Para j = 1 se compara el 5 con el 3 y se cambian de orden. ADRIANA BONJOUR-- VIRGINIA URÍA Página 2 10 de julio de 2012 CLASE 30/6/2012 Para j = 2 se compara el 5 y el 1 y se cambian, Para j = 3 se compara 5 y 8, en este caso no se cambia, finalizando el bucle con una lista mejor ordenada, puede verse que los dos valores más altos ya ocupan su lugar. No se ha realizado ninguna comparación con el término cuarto, dado que ya se sabe que después del primer ciclo es el mayor de la lista. El algoritmo consiste en comparaciones sucesivas de dos términos consecutivos, ascendiendo de abajo a arriba en cada iteración, como la ascensión de las burbujas de aire en el agua, de ahí el nombre del procedimiento, en la primera iteración el recorrido ha sido completo, en el segundo se ha dejado él último término, al tener ya el mayor de los valores, en los sucesivos sé ira dejando de realizar las ultimas comparaciones, como se puede ver. Y así se sigue hasta que quede totalmente ordenado. Ahora i vale 2 y j recorrerá los valores de 0 a 4. Cuando j vale 0, se comparan a[0] y a[1]esto es el -4 y el 3 dado que -4 es menor que 3 no se permutan los valores, j pasa a valer 1, con lo que se comparan los términos a[1] y a[2] el 3 y el 1 que como 3 > 1, se intercambian, para j = 2 comparamos a[2] con a[3] 3 y 5 como 3< 5 quedan en el mismo orden, lo mismo sucede con a[3] con a[4], dando así lugar a una lista algo más ordenada que la anterior, desde esta nueva ordenación. Este proceso seguirá así para i=3, y para i=4, ordenándose toda la lista. Hay que tener en cuenta que el bucle para realiza un número fijo de repeticiones y para finalizar tendrán que completarse, aun en el caso extremo, de que la lista este previamente ordenada. Ventajas: Fácil implementación. No requiere memoria adicional. Desventajas: Muy lento. Realiza numerosas comparaciones. Realiza numerosos intercambios. Este algoritmo es uno de los más pobres en rendimiento. No es recomendable usarlo. Veamos el ejemplo más simplificado de nuestra lista viendo cómo cambia el orden durante el bucle. 8 5 -4 3 1 Tenemos 5 elementos. Es decir, n toma el valor 5. Comenzamos comparando el primero con el segundo elemento. 8 es mayor que 5, así que intercambiamos. Ahora tenemos: 5 8 -4 3 1 Ahora comparamos el segundo con el tercero: 8 es mayor que -4, así que intercambiamos de nuevo. ADRIANA BONJOUR-- VIRGINIA URÍA Página 3 10 de julio de 2012 CLASE 30/6/2012 5 -4 8 3 1 Continuamos con el tercero y el cuarto: 8 es mayor que 3. Intercambiamos y obtenemos: 5 -4 3 8 1 Comparamos el cuarto y el quinto: 8 es mayor que 1. Intercambiamos nuevamente: 5 -4 3 1 8 Repitiendo este proceso vamos obteniendo los siguientes resultados: -4 5 3 1 8 -4 3 5 1 8 -4 3 1 5 8 al comparar el 5 con el 8, como el 5 es menor que 8, no se hace nada, y se continua comparando. -4 1 3 5 8 BIBLIOGRAFÍA Los ejemplos son los dados en clase al igual que algunas explicaciones realizadas en clase. -.COMO PROGRAMAR EN C/C++. H.M.DEITEL Y P.J.DEITEL-SEGUNDA EDICION PRENTICE HALL páginas 223.224.225. ADRIANA BONJOUR-- VIRGINIA URÍA Página 4