fbpx
Wikipedia

Ordenamiento de burbuja

La Ordenación de burbuja (Bubble Sort en inglés) es un sencillo algoritmo de ordenamiento. 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 uno de los más sencillos de implementar.

Representación animada de ordenación de un conjunto de números mediante el algoritmo burbuja. Comenzando desde el inicio del arreglo, se compara cada par de elementos adyacentes. Si ambos no están ordenados (el segundo es menor que el primero), se intercambian sus posiciones. En cada iteración, un elemento menos necesita ser evaluados (el último), ya que no hay más elementos a su derecha que necesiten ser comparados, puesto que ya están ordenados.

Descripción

Una manera simple de expresar el ordenamiento de burbuja en pseudocódigo es la siguiente:

 
 
 
 
 
 
 
 
 
 
 

Este algoritmo realiza el ordenamiento o reordenamiento de una lista a de n valores, en este caso de n términos numerados del 0 al n-1; consta de dos bucles anidados, uno con el índice i, que da un tamaño menor al recorrido de la burbuja en sentido inverso de 2 a n, y un segundo bucle con el índice j, con un recorrido desde 0 hasta n-i, 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 mayor que el segundo sus valores se intercambian.

Esta comparación se repite en el centro de los dos bucles, dando lugar a una lista ordenada. Puede verse que el número de repeticiones solo depende de n y no del orden de los términos, esto es, si pasamos al algoritmo una lista ya ordenada, realizará todas las comparaciones exactamente igual que para una lista no ordenada. Esta es una característica de este algoritmo. Luego veremos una variante que evita este inconveniente.

Para comprender el funcionamiento, veamos un ejemplo sencillo:

Tenemos una lista de números que hay que ordenar:

 
 

Podemos ver que la lista que tiene cinco términos, luego:

 

El índice i hará un recorrido de 2 hasta n:

 

que en este caso será de 2 a 5. Para cada uno de los valores de i, j tomará sucesivamente los valores de 0 hasta n-i:

 

Para cada valor de j, obtenido en ese orden, se compara el valor del índice j con el siguiente:

 

Si el término 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:

 

Para la primera iteración del primer bucle:

 

y j tomará los valores de 0 hasta 3:

 

Cuando j vale 0, se comparan  , el 55 y el 86, dado que 55 < 86, no se permuta el orden.

Ahora j vale 1 y se comparan   el 86 y el 48. Como 86 > 48, se permutan, dando lugar a una nueva lista.

Se repite el proceso hasta que j valga 3, dando lugar a una lista parcialmente ordenada. Podemos ver que el término de mayor valor está en el lugar más alto.

 

Ahora i vale 3, y j hará un recorrido de 0 a 2.

Primero j vale 0, se comparan  , el 55 y el 48. Como 55 > 48 se permutan dando lugar a la nueva lista.

Para j = 1 se compara el 55 con el 16 y se cambian de orden.

Para j = 2 se compara el 55 y el 82 y se dejan como están, 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 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 últimas comparaciones, como se puede ver.

 

Ahora ya i vale 4 y j recorrerá los valores de 0 a 1.

Cuando j vale 0, se comparan  , esto es, el 48 y el 16. Dado que 48 es mayor que 16 se permutan los valores, dando lugar a una lista algo más ordenada que la anterior. Desde esta nueva ordenación, j pasa a valer 1, con lo que se comparan los términos   el 48 y el 55 que quedan en el mismo orden.

En este caso la burbuja ha ascendido menos que en los casos anteriores, y la lista está ya ordenada, pero el algoritmo tendrá que completarse, realizando una última iteración.

Hay que tener en cuenta que el bucle realiza un número fijo de repeticiones y para finalizar tendrán que completarse, aun en el caso extremo, de que la lista estuviera previamente ordenada.

Por último i vale 5 y j solo puede vale 0, con lo que sólo se realizará una comparación de   el 16 y el 48, que ya están ordenados y se dejan igual.

 

Los bucles finalizan y también el procedimiento, dejando la lista ordenada.

Una variante que finaliza en caso de que la lista esté ordenada, puede ser la siguiente: como en el ejemplo anterior, empleando un centinela ordenado, que detecta que no se ha modificado la lista en un recorrido de la burbuja, y que por tanto la lista ya está ordenada, finalizando inmediatamente.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Análisis

 

Rendimiento del algoritmo

Al algoritmo de la burbuja, para ordenar un arreglo de n términos, tiene que realizar siempre el mismo número de comparaciones:

 

Esto es, el número de comparaciones c(n) no depende del orden de los términos, si no del número de términos:

 

Por lo tanto la cota ajustada asintótica del número de comparaciones pertenece al orden de n cuadrado.

El número de intercambios i(n), que hay que realizar depende del orden de los términos y podemos diferenciar, el caso mejor, si el arreglo está previamente ordenado, y el caso peor, si el arreglo está ordenado en orden inverso:

 

Por lo que no se puede determinar una cota ajustada asintótica del número de intercambios, dado que éste dependerá del orden del arreglo en cuestión.

Rendimiento en el caso desfavorable

Si pasamos al algoritmo un arreglo ordenado en orden inverso realizará un número de comparaciones:

 

Como ya hemos dicho anteriormente, y tendrá que realizar un número igual de intercambios entre los términos del arreglo, dado que en cada comparación los términos estarán desordenados, y se realizará el intercambio.

 

Por lo tanto en el caso más desfavorable tanto el número de comparaciones como el de intercambios coinciden:

 

El número de comparaciones o de intercambios en el caso más desfavorable pertenece al orden de n cuadrado.

Rendimiento en casos óptimos

En el caso óptimo, el más favorable, es la ordenación de un arreglo ya ordenado. En este caso el número de comparaciones será el mismo que en cualquier otro caso:

 

La cota inferior asintótica del número de comparaciones pertenece al orden de n cuadrado, como en los demás casos, pero en todas las comparaciones el orden es el correcto y por tanto no se realiza ningún intercambio:

 

Por lo tanto el coste de intercambios no depende de n, y es constante:

 

El ordenamiento de burbuja tiene una complejidad Ω(n²) igual que ordenamiento por selección. Cuando una lista ya está ordenada, a diferencia del ordenamiento por inserción que pasará por la lista una vez y encontrará que no hay necesidad de intercambiar las posiciones de los elementos, el método de ordenación por burbuja está forzado a pasar por dichas comparaciones, lo que hace que su complejidad sea cuadrática en el mejor de los casos. Esto lo cataloga como uno de los algoritmos de ordenación más ineficientes que existen, aunque para muchos programadores sea el más sencillo de implementar.

Conejos y Tortugas

La posición de los elementos en el ordenamiento de burbuja juegan un papel muy importante en la determinación del rendimiento. Los elementos mayores al principio de la lista son rápidamente movidos hacia abajo, mientras los elementos menores en el fondo de la lista se mueven a la parte superior muy lentamente. Esto llevó a nombrar estos elementos conejos y tortugas, respectivamente.

Se han realizado varios esfuerzos para eliminar las tortugas (véase Exterminación) y mejorar la velocidad del ordenamiento de burbuja, la cual será más redonda que nunca. El Ordenamiento por sacudida es un buen ejemplo, aunque aún mantiene, en el peor de los casos, una complejidad O (n2). El ordenamiento por combinación compara los elementos primero en pedazos grandes de la lista, moviendo tortugas extremadamente rápido, antes de proceder a pedazos cada vez más pequeños para alisar la lista. Su velocidad promedio es comparable a algoritmos rápidos (y complejos) como el ordenamiento rápido.

En la práctica

A pesar de que el ordenamiento de burbuja es uno de los algoritmos más sencillos de implementar, su orden O (n2) lo hace muy ineficiente para usar en listas que tengan más que un número reducido de elementos. Incluso entre los algoritmos de ordenamiento de orden O (n2), otros procedimientos como el ordenamiento por inserción son considerados más eficientes.

Dada su simplicidad, el ordenamiento de burbuja es utilizado para introducir el concepto de algoritmo de ordenamiento para estudiantes de ciencias de la computación. A pesar de esto, algunos investigadores como Owen Astrachan han criticado su popularidad en la enseñanza de ciencias de la computación, llegando a recomendar su eliminación de los planes de estudio.[1]

Sumado a esto, Jargon File, un libro ampliamente citado en la cultura hacker, lo denomina "el mal algoritmo genérico", y Donald Knuth, uno de los mayores expertos en ciencias de la computación, afirma que el ordenamiento de burbuja "no parece tener nada para recomendar su uso, a excepción de un nombre pegadizo y el hecho de que conlleva a problemas teóricos interesantes".[2]

El ordenamiento de burbuja es asintóticamente equivalente en tiempos de ejecución con el ordenamiento por inserción en el peor de los casos, pero ambos algoritmos difieren principalmente en la cantidad de intercambios que son necesarios. Resultados experimentales como los descubiertos por Astrachan han demostrado que el ordenamiento por inserción funciona considerablemente mejor incluso con listas aleatorias. Por esta razón, muchos libros de algoritmos modernos evitan usar el ordenamiento de burbuja, reemplazándolo por el ordenamiento por inserción.

El ordenamiento de burbuja interactúa vagamente con el hardware de las CPU modernas. Requiere al menos el doble de escrituras que el ordenamiento por inserción, el doble de pérdidas de caché, y asintóticamente más predicción de saltos. Varios experimentos de ordenamiento de cadenas en Java hechos por Astrachan muestran que el ordenamiento de burbuja es 5 veces más lento que el ordenamiento por inserción, y 40% más lento que el ordenamiento por selección.[1]

Ejemplo paso a paso

Tomemos como ejemplo los números: "9 6 5 8 2 1", que serán ordenados de menor a mayor valor usando el método burbuja. Los elementos siguientes resaltados están siendo comparados.

Primera vuelta: ( 9 6 5 8 2 1 )   ( 6 9 5 8 2 1 ), el algoritmo compara los primeros dos elementos y los cambia porque 9 > 6 ( 6 9 5 8 2 1 )   ( 6 5 9 8 2 1 ) ( 6 5 9 8 2 1 )   ( 6 5 8 9 2 1 ) ( 6 5 8 9 2 1 )   ( 6 5 8 2 9 1 ) ( 6 5 8 2 9 1 )   ( 6 5 8 2 1 9 )

Segunda vuelta: ( 6 5 8 2 1 9 )   ( 5 6 8 2 1 9 ) ( 5 6 8 2 1 9 )   ( 5 6 8 2 1 9 ), como estos elementos ya están en orden, el algoritmo no hace cambios. ( 5 6 8 2 1 9 )   ( 5 6 2 8 1 9 ) ( 5 6 2 8 1 9 )   ( 5 6 2 1 8 9 ) ( 5 6 2 1 8 9 )   ( 5 6 2 1 8 9 )

Tercera vuelta: ( 5 6 2 1 8 9 )   ( 5 6 2 1 8 9 ) ( 5 6 2 1 8 9 )   ( 5 2 6 1 8 9 ) ( 5 2 6 1 8 9 )   ( 5 2 1 6 8 9 ) ( 5 2 1 6 8 9 )   ( 5 2 1 6 8 9 ) ( 5 2 1 6 8 9 )   ( 5 2 1 6 8 9 )

Cuarta vuelta: ( 5 2 1 6 8 9 )   ( 2 5 1 6 8 9 ) ( 2 5 1 6 8 9 )   ( 2 1 5 6 8 9 ) ( 2 1 5 6 8 9 )   ( 2 1 5 6 8 9 ) ( 2 1 5 6 8 9 )   ( 2 1 5 6 8 9 ) ( 2 1 5 6 8 9 )   ( 2 1 5 6 8 9 )

Quinta vuelta: ( 2 1 5 6 8 9 )   ( 1 2 5 6 8 9 ) ( 1 2 5 6 8 9 )   ( 1 2 5 6 8 9 ) ( 1 2 5 6 8 9 )   ( 1 2 5 6 8 9 ) ( 1 2 5 6 8 9 )   ( 1 2 5 6 8 9 ) ( 1 2 5 6 8 9 )   ( 1 2 5 6 8 9 )

Ejemplo en C++

Este es un ejemplo de un programa que captura números y los ordena de menor a mayor en lenguaje C++, compilado con g++ 5.4.0:

#include<iostream> using namespace std; int main() { int num, aux; int comparaciones = 0; int intercambios = 0; int* arreglo; cout << "Cuantos numeros seran: "; cin >> num; arreglo = new int[num]; cout << endl << "***CAPTURA DE NUMEROS***" << endl; for(int x = 0; x < num; x++) { cout << "Ingresa el numero " << x << " de la serie: "; cin >> arreglo[x]; cout << endl; } cout << "***MUESTRA DE NUMEROS***" << endl; for(int y = 0; y < num; y++) { cout << "Numero " << y << ".- " << arreglo[y] << endl; } for(int z = 1; z < num; ++z) { for(int v = 0; v < (num - z); v++) { comparaciones++; if(arreglo[v] > arreglo[v+1]){  aux = arreglo[v];  arreglo[v] = arreglo[v + 1];  arreglo[v + 1] = aux;  intercambios++; } } } cout << "***NUMEROS ARREGLADOS***" << endl; for(int w = 0; w < num; w++) { cout << "Numero " << w << ".- " << arreglo[w] << endl; } cout << "Numero de comparaciones: " << comparaciones << endl; cout << "Numero de intercambios: " << intercambios << endl; delete[] arreglo; return 0; } 

Ejemplo en Python3

def bubbleSort(array): n = len(array) for i in range(n): for j in range(0, n-1):  if array[j] > array[j+1]:  array[j], array[j+1] = array[j+1], array[j] array = [200 ,190, 1200, 1, 2, 4, 55, 1000, 6, 800] bubbleSort(array) print(array) 

Referencias

  1. Astrachan, Owen (2003). «Ordenamiento de burbuja: Un anális arqueológico de un algoritmo». SIGCSE (en inglés). Consultado el 9 de marzo de 2011. 
  2. Knuth, Donald (1998). «5.2.2: Ordenamiento por intercambio». El arte de programar ordenadores, Volumen 3 (en inglés) (segunda edición). Addison-Wesley. pp. 106-110. ISBN 0-201-89685-0. 

Véase también

Enlaces externos

  • Implementaciones del algoritmo en Wikibooks (inglés)
  • Distintas implementaciones del algoritmo en RosettaCode.org
  • Implementación del algoritmo Bubblesort en Javascript (en español)
  •   Datos: Q60864
  •   Multimedia: Bubble sort

ordenamiento, burbuja, ordenación, burbuja, bubble, sort, inglés, sencillo, algoritmo, ordenamiento, funciona, revisando, cada, elemento, lista, ordenada, siguiente, intercambiándolos, posición, están, orden, equivocado, necesario, revisar, varias, veces, toda. La Ordenacion de burbuja Bubble Sort en ingles es un sencillo algoritmo de ordenamiento Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente intercambiandolos de posicion si estan en el orden equivocado Es necesario revisar varias veces toda la lista hasta que no se necesiten mas intercambios lo cual significa que la lista esta ordenada Este algoritmo obtiene su nombre de la forma con la que suben por la lista los elementos durante los intercambios como si fueran pequenas burbujas Tambien es conocido como el metodo del intercambio directo Dado que solo usa comparaciones para operar elementos se lo considera un algoritmo de comparacion siendo uno de los mas sencillos de implementar Representacion animada de ordenacion de un conjunto de numeros mediante el algoritmo burbuja Comenzando desde el inicio del arreglo se compara cada par de elementos adyacentes Si ambos no estan ordenados el segundo es menor que el primero se intercambian sus posiciones En cada iteracion un elemento menos necesita ser evaluados el ultimo ya que no hay mas elementos a su derecha que necesiten ser comparados puesto que ya estan ordenados Indice 1 Descripcion 2 Analisis 2 1 Rendimiento del algoritmo 2 2 Rendimiento en el caso desfavorable 2 3 Rendimiento en casos optimos 3 Conejos y Tortugas 4 En la practica 5 Ejemplo paso a paso 6 Ejemplo en C 7 Ejemplo en Python3 8 Referencias 9 Vease tambien 10 Enlaces externosDescripcion EditarUna manera simple de expresar el ordenamiento de burbuja en pseudocodigo es la siguiente p r o c e d i m i e n t o D e L a B u r b u j a a 0 a 1 a 2 a n 1 displaystyle color Sepia mathit procedimiento color red mathit DeLaBurbuja color Black mathit a color Plum mathit 0 color Black mathit a color Plum mathit 1 color Black mathit a color Plum mathit 2 ldots color Black mathit a color black mathit n color Blue mathit color Plum mathit 1 p a r a i 1 h a s t a n 1 h a c e r displaystyle color Sepia mathit para color Black mathit i color Blue mathit gets color Plum mathit 1 color Sepia mathit hasta color Black mathit n color Blue mathit color Plum mathit 1 color Sepia mathit hacer p a r a j 0 h a s t a n i 1 h a c e r displaystyle color Sepia mathit para color Black mathit j color Blue mathit gets color Plum mathit 0 color Sepia mathit hasta color Black mathit n color Blue mathit color Black mathit i color Blue mathit color Plum mathit 1 color Sepia mathit hacer s i a j gt a j 1 e n t o n c e s displaystyle color Sepia mathit si color Black mathit a color Black mathit j color Blue mathit gt color Black mathit a color Black mathit j color Blue mathit color Plum mathit 1 color Sepia mathit entonces dd dd dd a u x a j displaystyle color Black mathit aux color Blue mathit gets color Black mathit a color Black mathit j a j a j 1 displaystyle color Black mathit a color Black mathit j color Blue mathit gets color Black mathit a color Black mathit j color Blue mathit color Plum mathit 1 a j 1 a u x displaystyle color Black mathit a color Black mathit j color Blue mathit color Plum mathit 1 color Blue mathit gets color Black mathit aux dd f i n s i displaystyle color Sepia mathit fin si dd f i n p a r a displaystyle color Sepia mathit fin para dd f i n p a r a displaystyle color Sepia mathit fin para dd f i n p r o c e d i m i e n t o displaystyle color Sepia mathit fin procedimiento Este algoritmo realiza el ordenamiento o reordenamiento de una lista a de n valores en este caso de n terminos numerados del 0 al n 1 consta de dos bucles anidados uno con el indice i que da un tamano menor al recorrido de la burbuja en sentido inverso de 2 a n y un segundo bucle con el indice j con un recorrido desde 0 hasta n i para cada iteracion del primer bucle que indica el lugar de la burbuja La burbuja son dos terminos de la lista seguidos j y j 1 que se comparan si el primero es mayor que el segundo sus valores se intercambian Esta comparacion se repite en el centro de los dos bucles dando lugar a una lista ordenada Puede verse que el numero de repeticiones solo depende de n y no del orden de los terminos esto es si pasamos al algoritmo una lista ya ordenada realizara todas las comparaciones exactamente igual que para una lista no ordenada Esta es una caracteristica de este algoritmo Luego veremos una variante que evita este inconveniente Para comprender el funcionamiento veamos un ejemplo sencillo Tenemos una lista de numeros que hay que ordenar a 55 86 48 16 82 displaystyle a 55 86 48 16 82 a 4 82 a 3 16 a 2 48 a 1 86 a 0 55 displaystyle begin array r a 4 82 a 3 16 a 2 48 a 1 86 a 0 55 end array Podemos ver que la lista que tiene cinco terminos luego n 5 displaystyle n 5 El indice i hara un recorrido de 2 hasta n p a r a i 2 h a s t a n h a c e r displaystyle color Sepia mathit para color Black mathit i color BlueViolet mathit gets color Black mathit 2 color Sepia mathit hasta color Black mathit n color Sepia mathit hacer que en este caso sera de 2 a 5 Para cada uno de los valores de i j tomara sucesivamente los valores de 0 hasta n i p a r a j 0 h a s t a n i h a c e r displaystyle color Sepia mathit para color Black mathit j color BlueViolet mathit gets color Black mathit 0 color Sepia mathit hasta color Black mathit n i color Sepia mathit hacer Para cada valor de j obtenido en ese orden se compara el valor del indice j con el siguiente s i a j gt a j 1 e n t o n c e s displaystyle color Sepia mathit si color Black a j color BlueViolet gt color Black a j 1 color Sepia mathit entonces Si el termino j es mayor que el termino j 1 los valores se permutan en caso contrario se continua con la iteracion j 0 j 1 j 2 j 3 a 4 82 82 82 82 86 a 3 16 16 16 86 82 a 2 48 48 86 16 16 a 1 86 86 48 48 48 a 0 55 55 55 55 55 displaystyle begin array r r r r r r amp j 0 amp j 1 amp j 2 amp j 3 amp hline a 4 amp 82 amp 82 amp 82 amp to 82 amp 86 a 3 amp 16 amp 16 amp to 16 amp to 86 amp 82 a 2 amp 48 amp to 48 amp to 86 amp 16 amp 16 a 1 amp to 86 amp to 86 amp 48 amp 48 amp 48 a 0 amp to 55 amp 55 amp 55 amp 55 amp 55 end array Para el caso del ejemplo tenemos que n 5 displaystyle n 5 Para la primera iteracion del primer bucle i 2 displaystyle i 2 y j tomara los valores de 0 hasta 3 p a r a j 0 h a s t a 3 h a c e r displaystyle color Sepia mathit para color Black mathit j color BlueViolet mathit gets color Black mathit 0 color Sepia mathit hasta color Black mathit 3 color Sepia mathit hacer Cuando j vale 0 se comparan a 0 a 1 displaystyle a 0 a 1 el 55 y el 86 dado que 55 lt 86 no se permuta el orden Ahora j vale 1 y se comparan a 1 a 2 displaystyle a 1 a 2 el 86 y el 48 Como 86 gt 48 se permutan dando lugar a una nueva lista Se repite el proceso hasta que j valga 3 dando lugar a una lista parcialmente ordenada Podemos ver que el termino de mayor valor esta en el lugar mas alto j 0 j 1 j 2 a 4 86 86 86 86 a 3 82 82 82 82 a 2 16 16 55 55 a 1 48 55 16 16 a 0 55 48 48 48 displaystyle begin array r r r r r amp j 0 amp j 1 amp j 2 amp hline a 4 amp 86 amp 86 amp 86 amp 86 a 3 amp 82 amp 82 amp to 82 amp 82 a 2 amp 16 amp to 16 amp to 55 amp 55 a 1 amp to 48 amp to 55 amp 16 amp 16 a 0 amp to 55 amp 48 amp 48 amp 48 end array Ahora i vale 3 y j hara un recorrido de 0 a 2 Primero j vale 0 se comparan a 0 a 1 displaystyle a 0 a 1 el 55 y el 48 Como 55 gt 48 se permutan dando lugar a la nueva lista Para j 1 se compara el 55 con el 16 y se cambian de orden Para j 2 se compara el 55 y el 82 y se dejan como estan finalizando el bucle con una lista mejor ordenada Puede verse que los dos valores mas altos ya ocupan su lugar No se ha realizado ninguna comparacion con el termino cuarto dado que ya se sabe que despues del primer ciclo es el mayor de la lista El algoritmo consiste en comparaciones sucesivas de dos terminos consecutivos ascendiendo de abajo arriba en cada iteracion como la ascension de las burbujas de aire en el agua de ahi el nombre del procedimiento En la primera iteracion el recorrido ha sido completo en el segundo se ha dejado el ultimo termino al tener ya el mayor de los valores en los sucesivos se ira dejando de realizar las ultimas comparaciones como se puede ver j 0 j 1 a 4 86 86 86 a 3 82 82 82 a 2 55 55 55 a 1 16 48 48 a 0 48 16 16 displaystyle begin array r r r r amp j 0 amp j 1 amp hline a 4 amp 86 amp 86 amp 86 a 3 amp 82 amp 82 amp 82 a 2 amp 55 amp to 55 amp 55 a 1 amp to 16 amp to 48 amp 48 a 0 amp to 48 amp 16 amp 16 end array Ahora ya i vale 4 y j recorrera los valores de 0 a 1 Cuando j vale 0 se comparan a 0 a 1 displaystyle a 0 a 1 esto es el 48 y el 16 Dado que 48 es mayor que 16 se permutan los valores dando lugar a una lista algo mas ordenada que la anterior Desde esta nueva ordenacion j pasa a valer 1 con lo que se comparan los terminos a 1 a 2 displaystyle a 1 a 2 el 48 y el 55 que quedan en el mismo orden En este caso la burbuja ha ascendido menos que en los casos anteriores y la lista esta ya ordenada pero el algoritmo tendra que completarse realizando una ultima iteracion Hay que tener en cuenta que el bucle realiza un numero fijo de repeticiones y para finalizar tendran que completarse aun en el caso extremo de que la lista estuviera previamente ordenada Por ultimo i vale 5 y j solo puede vale 0 con lo que solo se realizara una comparacion de a 0 a 1 displaystyle a 0 a 1 el 16 y el 48 que ya estan ordenados y se dejan igual j 0 a 4 86 86 a 3 82 82 a 2 55 55 a 1 48 48 a 0 16 16 displaystyle begin array r r r amp j 0 amp hline a 4 amp 86 amp 86 a 3 amp 82 amp 82 a 2 amp 55 amp 55 a 1 amp to 48 amp 48 a 0 amp to 16 amp 16 end array Los bucles finalizan y tambien el procedimiento dejando la lista ordenada Una variante que finaliza en caso de que la lista este ordenada puede ser la siguiente como en el ejemplo anterior empleando un centinela ordenado que detecta que no se ha modificado la lista en un recorrido de la burbuja y que por tanto la lista ya esta ordenada finalizando inmediatamente p r o c e d i m i e n t o D e L a B u r b u j a 2 a 0 a 1 a 2 a n 1 displaystyle color Sepia procedimiento color BlueViolet DeLaBurbuja2 color Black a 0 a 1 a 2 ldots a n 1 i 1 displaystyle color Black i color BlueViolet gets color Black 1 o r d e n a d o n o displaystyle color Black ordenado color BlueViolet gets color Black no m i e n t r a s i lt n o r d e n a d o n o h a c e r displaystyle color Sepia mathit mientras color Black mathit i lt n land ordenado no color Sepia mathit hacer i i 1 displaystyle color Black i color BlueViolet gets color Black i 1 o r d e n a d o s i displaystyle color Black ordenado color BlueViolet gets color Black si p a r a j 0 h a s t a n i h a c e r displaystyle color Sepia mathit para color Black mathit j color BlueViolet mathit gets color Black mathit 0 color Sepia mathit hasta color Black mathit n i color Sepia mathit hacer s i a j gt a j 1 e n t o n c e s displaystyle color Sepia mathit si color Black a j color BlueViolet gt color Black a j 1 color Sepia mathit entonces o r d e n a d o n o displaystyle color Black ordenado color BlueViolet gets color Black no a u x a j displaystyle color Black aux color BlueViolet gets color Black a j a j a j 1 displaystyle color Black a j color BlueViolet gets color Black a j 1 a j 1 a u x displaystyle color Black a j 1 color BlueViolet gets color Black aux dd f i n s i displaystyle color Sepia mathit fin si dd f i n p a r a displaystyle color Sepia mathit fin para dd f i n m i e n t r a s displaystyle color Sepia mathit fin mientras dd f i n p r o c e d i m i e n t o displaystyle color Sepia mathit fin procedimiento p r o c e d i m i e n t o D e L a B u r b u j a 3 a 0 a 1 a 2 a n 1 displaystyle color Sepia procedimiento color BlueViolet DeLaBurbuja3 color Black a 0 a 1 a 2 ldots a n 1 i 1 displaystyle color Black i color BlueViolet gets color Black 1 r e p e t i r displaystyle color Sepia mathit repetir i i 1 displaystyle color Black i color BlueViolet gets color Black i 1 o r d e n a d o s i displaystyle color Black ordenado color BlueViolet gets color Black si p a r a j 0 h a s t a n i h a c e r displaystyle color Sepia mathit para color Black mathit j color BlueViolet mathit gets color Black mathit 0 color Sepia mathit hasta color Black mathit n i color Sepia mathit hacer s i a j gt a j 1 e n t o n c e s displaystyle color Sepia mathit si color Black a j color BlueViolet gt color Black a j 1 color Sepia mathit entonces o r d e n a d o n o displaystyle color Black ordenado color BlueViolet gets color Black no a u x a j displaystyle color Black aux color BlueViolet gets color Black a j a j a j 1 displaystyle color Black a j color BlueViolet gets color Black a j 1 a j 1 a u x displaystyle color Black a j 1 color BlueViolet gets color Black aux dd f i n s i displaystyle color Sepia mathit fin si dd f i n p a r a displaystyle color Sepia mathit fin para dd h a s t a q u e i lt n o r d e n a d o s i displaystyle color Sepia mathit hasta que color Black mathit neg i lt n lor ordenado si dd f i n p r o c e d i m i e n t o displaystyle color Sepia mathit fin procedimiento Analisis Editar Rendimiento del algoritmo Editar Articulo principal Cota ajustada asintotica Al algoritmo de la burbuja para ordenar un arreglo de n terminos tiene que realizar siempre el mismo numero de comparaciones c n n 2 n 2 displaystyle c n cfrac n 2 n 2 Esto es el numero de comparaciones c n no depende del orden de los terminos si no del numero de terminos 8 c n n 2 displaystyle Theta c n n 2 Por lo tanto la cota ajustada asintotica del numero de comparaciones pertenece al orden de n cuadrado El numero de intercambios i n que hay que realizar depende del orden de los terminos y podemos diferenciar el caso mejor si el arreglo esta previamente ordenado y el caso peor si el arreglo esta ordenado en orden inverso 8 i n displaystyle Theta i n Por lo que no se puede determinar una cota ajustada asintotica del numero de intercambios dado que este dependera del orden del arreglo en cuestion Rendimiento en el caso desfavorable Editar Articulo principal Cota superior asintotica Si pasamos al algoritmo un arreglo ordenado en orden inverso realizara un numero de comparaciones c n n 2 n 2 displaystyle c n cfrac n 2 n 2 Como ya hemos dicho anteriormente y tendra que realizar un numero igual de intercambios entre los terminos del arreglo dado que en cada comparacion los terminos estaran desordenados y se realizara el intercambio i n n 2 n 2 displaystyle i n cfrac n 2 n 2 Por lo tanto en el caso mas desfavorable tanto el numero de comparaciones como el de intercambios coinciden O c n O i n n 2 displaystyle O c n O i n n 2 El numero de comparaciones o de intercambios en el caso mas desfavorable pertenece al orden de n cuadrado Rendimiento en casos optimos Editar Articulo principal Cota inferior asintotica En el caso optimo el mas favorable es la ordenacion de un arreglo ya ordenado En este caso el numero de comparaciones sera el mismo que en cualquier otro caso W c n n 2 displaystyle Omega c n n 2 La cota inferior asintotica del numero de comparaciones pertenece al orden de n cuadrado como en los demas casos pero en todas las comparaciones el orden es el correcto y por tanto no se realiza ningun intercambio i n 0 displaystyle i n 0 Por lo tanto el coste de intercambios no depende de n y es constante W i n 1 displaystyle Omega i n 1 El ordenamiento de burbuja tiene una complejidad W n igual que ordenamiento por seleccion Cuando una lista ya esta ordenada a diferencia del ordenamiento por insercion que pasara por la lista una vez y encontrara que no hay necesidad de intercambiar las posiciones de los elementos el metodo de ordenacion por burbuja esta forzado a pasar por dichas comparaciones lo que hace que su complejidad sea cuadratica en el mejor de los casos Esto lo cataloga como uno de los algoritmos de ordenacion mas ineficientes que existen aunque para muchos programadores sea el mas sencillo de implementar Conejos y Tortugas EditarLa posicion de los elementos en el ordenamiento de burbuja juegan un papel muy importante en la determinacion del rendimiento Los elementos mayores al principio de la lista son rapidamente movidos hacia abajo mientras los elementos menores en el fondo de la lista se mueven a la parte superior muy lentamente Esto llevo a nombrar estos elementos conejos y tortugas respectivamente Se han realizado varios esfuerzos para eliminar las tortugas vease Exterminacion y mejorar la velocidad del ordenamiento de burbuja la cual sera mas redonda que nunca El Ordenamiento por sacudida es un buen ejemplo aunque aun mantiene en el peor de los casos una complejidad O n2 El ordenamiento por combinacion compara los elementos primero en pedazos grandes de la lista moviendo tortugas extremadamente rapido antes de proceder a pedazos cada vez mas pequenos para alisar la lista Su velocidad promedio es comparable a algoritmos rapidos y complejos como el ordenamiento rapido En la practica EditarA pesar de que el ordenamiento de burbuja es uno de los algoritmos mas sencillos de implementar su orden O n2 lo hace muy ineficiente para usar en listas que tengan mas que un numero reducido de elementos Incluso entre los algoritmos de ordenamiento de orden O n2 otros procedimientos como el ordenamiento por insercion son considerados mas eficientes Dada su simplicidad el ordenamiento de burbuja es utilizado para introducir el concepto de algoritmo de ordenamiento para estudiantes de ciencias de la computacion A pesar de esto algunos investigadores como Owen Astrachan han criticado su popularidad en la ensenanza de ciencias de la computacion llegando a recomendar su eliminacion de los planes de estudio 1 Sumado a esto Jargon File un libro ampliamente citado en la cultura hacker lo denomina el mal algoritmo generico y Donald Knuth uno de los mayores expertos en ciencias de la computacion afirma que el ordenamiento de burbuja no parece tener nada para recomendar su uso a excepcion de un nombre pegadizo y el hecho de que conlleva a problemas teoricos interesantes 2 El ordenamiento de burbuja es asintoticamente equivalente en tiempos de ejecucion con el ordenamiento por insercion en el peor de los casos pero ambos algoritmos difieren principalmente en la cantidad de intercambios que son necesarios Resultados experimentales como los descubiertos por Astrachan han demostrado que el ordenamiento por insercion funciona considerablemente mejor incluso con listas aleatorias Por esta razon muchos libros de algoritmos modernos evitan usar el ordenamiento de burbuja reemplazandolo por el ordenamiento por insercion El ordenamiento de burbuja interactua vagamente con el hardware de las CPU modernas Requiere al menos el doble de escrituras que el ordenamiento por insercion el doble de perdidas de cache y asintoticamente mas prediccion de saltos Varios experimentos de ordenamiento de cadenas en Java hechos por Astrachan muestran que el ordenamiento de burbuja es 5 veces mas lento que el ordenamiento por insercion y 40 mas lento que el ordenamiento por seleccion 1 Ejemplo paso a paso EditarTomemos como ejemplo los numeros 9 6 5 8 2 1 que seran ordenados de menor a mayor valor usando el metodo burbuja Los elementos siguientes resaltados estan siendo comparados Primera vuelta 9 6 5 8 2 1 displaystyle to 6 9 5 8 2 1 el algoritmo compara los primeros dos elementos y los cambia porque 9 gt 6 6 9 5 8 2 1 displaystyle to 6 5 9 8 2 1 6 5 9 8 2 1 displaystyle to 6 5 8 9 2 1 6 5 8 9 2 1 displaystyle to 6 5 8 2 9 1 6 5 8 2 9 1 displaystyle to 6 5 8 2 1 9 Segunda vuelta 6 5 8 2 1 9 displaystyle to 5 6 8 2 1 9 5 6 8 2 1 9 displaystyle to 5 6 8 2 1 9 como estos elementos ya estan en orden el algoritmo no hace cambios 5 6 8 2 1 9 displaystyle to 5 6 2 8 1 9 5 6 2 8 1 9 displaystyle to 5 6 2 1 8 9 5 6 2 1 8 9 displaystyle to 5 6 2 1 8 9 Tercera vuelta 5 6 2 1 8 9 displaystyle to 5 6 2 1 8 9 5 6 2 1 8 9 displaystyle to 5 2 6 1 8 9 5 2 6 1 8 9 displaystyle to 5 2 1 6 8 9 5 2 1 6 8 9 displaystyle to 5 2 1 6 8 9 5 2 1 6 8 9 displaystyle to 5 2 1 6 8 9 Cuarta vuelta 5 2 1 6 8 9 displaystyle to 2 5 1 6 8 9 2 5 1 6 8 9 displaystyle to 2 1 5 6 8 9 2 1 5 6 8 9 displaystyle to 2 1 5 6 8 9 2 1 5 6 8 9 displaystyle to 2 1 5 6 8 9 2 1 5 6 8 9 displaystyle to 2 1 5 6 8 9 Quinta vuelta 2 1 5 6 8 9 displaystyle to 1 2 5 6 8 9 1 2 5 6 8 9 displaystyle to 1 2 5 6 8 9 1 2 5 6 8 9 displaystyle to 1 2 5 6 8 9 1 2 5 6 8 9 displaystyle to 1 2 5 6 8 9 1 2 5 6 8 9 displaystyle to 1 2 5 6 8 9 Ejemplo en C EditarEste es un ejemplo de un programa que captura numeros y los ordena de menor a mayor en lenguaje C compilado con g 5 4 0 include lt iostream gt using namespace std int main int num aux int comparaciones 0 int intercambios 0 int arreglo cout lt lt Cuantos numeros seran cin gt gt num arreglo new int num cout lt lt endl lt lt CAPTURA DE NUMEROS lt lt endl for int x 0 x lt num x cout lt lt Ingresa el numero lt lt x lt lt de la serie cin gt gt arreglo x cout lt lt endl cout lt lt MUESTRA DE NUMEROS lt lt endl for int y 0 y lt num y cout lt lt Numero lt lt y lt lt lt lt arreglo y lt lt endl for int z 1 z lt num z for int v 0 v lt num z v comparaciones if arreglo v gt arreglo v 1 aux arreglo v arreglo v arreglo v 1 arreglo v 1 aux intercambios cout lt lt NUMEROS ARREGLADOS lt lt endl for int w 0 w lt num w cout lt lt Numero lt lt w lt lt lt lt arreglo w lt lt endl cout lt lt Numero de comparaciones lt lt comparaciones lt lt endl cout lt lt Numero de intercambios lt lt intercambios lt lt endl delete arreglo return 0 Ejemplo en Python3 Editardef bubbleSort array n len array for i in range n for j in range 0 n 1 if array j gt array j 1 array j array j 1 array j 1 array j array 200 190 1200 1 2 4 55 1000 6 800 bubbleSort array print array Referencias Editar a b Astrachan Owen 2003 Ordenamiento de burbuja Un analis arqueologico de un algoritmo SIGCSE en ingles Consultado el 9 de marzo de 2011 Knuth Donald 1998 5 2 2 Ordenamiento por intercambio El arte de programar ordenadores Volumen 3 en ingles segunda edicion Addison Wesley pp 106 110 ISBN 0 201 89685 0 fechaacceso requiere url ayuda Vease tambien EditarAlgoritmo de ordenamientoEnlaces externos EditarImplementaciones del algoritmo en Wikibooks ingles Distintas implementaciones del algoritmo en RosettaCode org Implementacion del algoritmo Bubblesort en Javascript en espanol Datos Q60864 Multimedia Bubble sortObtenido de https es wikipedia org w index php title Ordenamiento de burbuja amp oldid 135283788, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos