Orden de inserción vs algoritmos de ordenación de burbujas

85

Estoy tratando de entender algunos algoritmos de clasificación, pero estoy luchando por ver la diferencia en el algoritmo de clasificación de burbujas y clasificación de inserción.

Sé que ambos son O (n 2 ), pero me parece que la clasificación de burbujas solo burbujea el valor máximo de la matriz en la parte superior para cada pasada, mientras que la clasificación por inserción solo hunde el valor más bajo hacia la parte inferior en cada pasada. ¿No están haciendo exactamente lo mismo pero en diferentes direcciones?

Para la ordenación por inserción, el número de comparaciones / intercambios potenciales comienza en cero y aumenta cada vez (es decir, 0, 1, 2, 3, 4, ..., n) pero para la ordenación por burbujas ocurre el mismo comportamiento, pero al final de la clasificación (es decir, n, n-1, n-2, ... 0) porque la clasificación de burbujas ya no necesita comparar con los últimos elementos a medida que se ordenan.

Sin embargo, por todo esto, parece un consenso que el tipo de inserción es mejor en general. puede alguien decirme por que?

Editar: Estoy principalmente interesado en las diferencias en cómo funcionan los algoritmos, no tanto en su eficiencia o complejidad asintótica.

Migwell
fuente
1
Esto está bien documentado en otros lugares: consulte, por ejemplo, en.wikipedia.org/wiki/Sorting_algorithm . Es bastante inútil duplicar aquí y una buena respuesta será expansiva.
Betsabé
@Bathsheba 75 personas que han votado a favor y 88k que han visto la pregunta parecen no estar de acuerdo; )
analizador
@parsecer: ¡Ja! Ahora voy a tener que revisar las respuestas. La respuesta actual más votada a favor es útil; no estoy seguro de los demás. Aquí están algunos puntos de repetición perdidos por respuesta negativa. La afirmación "Es por eso que la ordenación por inserción es más rápida que la ordenación por burbujas" en la respuesta aceptada no es necesariamente cierta.
Betsabé
@Bathsheba Oh no
parsecer

Respuestas:

38

En la clasificación de burbujas en la iteración ith tiene iteraciones internas ni-1 (n ^ 2) / 2 en total, pero en la ordenación por inserción tiene iteraciones máximas en el paso i'th, pero i / 2 en promedio, ya que puede detener el bucle interno antes, después de encontrar la posición correcta para el elemento actual. Entonces tienes (suma de 0 an) / 2 que es (n ^ 2) / 4 total;

Es por eso que la ordenación por inserción es más rápida que la ordenación por burbujas.

sasha.sochka
fuente
2
La explicación del algoritmo está en la web en todas partes, creo.
sasha.sochka
3
sí, pero parece que el OP todavía no
detecta
15
Bueno, puedes asumir que entiendo los fundamentos . Lo que quería era una comparación, y esta es bastante buena. Entonces, la idea es que mientras que la ordenación por inserción hace que el elemento i-ésimo se hunda, y la ordenación por burbujas hace que se expanda, la ordenación por inserción no hace que caiga al fondo, solo hace que caiga en la posición correcta en la sección ya ordenada. Por lo tanto, hace menos comparaciones / intercambios. ¿Está bien?
Migwell
1
¿Qué? "Entonces tienes (suma de 0 an) / 2 que es (n ^ 2) / 4 total" ¡Eso requiere algo de explicación, por favor! 0 + 1 + 2 + 3 + 4 + 5 = 15; 15/2 = 7,5; 7,5 * 4 = 30; sqrt (30) = galimatías
John Smith
@JohnSmith Creo que hay un pequeño error en la respuesta. La suma de 1 an es n * (n + 1) / 2 ya que es un número triangular. Busque el número triangular para obtener más explicaciones. Entonces, eso dividido por 2 es solo n * (n + 1) / 2.
CognizantApe
122

Tipo de inserción

Después de i iteraciones , se ordenan los primeros i elementos.

En cada iteración, el siguiente elemento se burbujea a través de la sección ordenada hasta que llega al lugar correcto:

sorted  | unsorted
1 3 5 8 | 4 6 7 9 2
1 3 4 5 8 | 6 7 9 2

El 4 se burbujea en la sección ordenada

Pseudocódigo:

for i in 1 to n
    for j in i downto 2
        if array[j - 1] > array[j]
            swap(array[j - 1], array[j])
        else
            break

Ordenamiento de burbuja

Después de i iteraciones, los últimos i elementos son los más grandes y están ordenados.

En cada iteración, revise la sección sin clasificar para encontrar el máximo.

unsorted  | biggest
3 1 5 4 2 | 6 7 8 9
1 3 4 2 | 5 6 7 8 9

El 5 sale de la sección sin clasificar

Pseudocódigo:

for i in 1 to n
    for j in 1 to n - i
         if array[j] > array[j + 1]
             swap(array[j], array[j + 1])

Tenga en cuenta que las implementaciones típicas terminan antes si no se realizan intercambios durante una de las iteraciones del ciclo externo (ya que eso significa que la matriz está ordenada).

Diferencia

En la ordenación por inserción, los elementos se burbujean en la sección ordenada, mientras que en la ordenación por burbujas, los máximos se eliminan de la sección sin clasificar.

tom
fuente
10
¡Gracias, esto es muy claro! Creo que lo principal que necesitaba resaltar es que la instrucción break en Insertion Sort significa que puede terminar cada iteración antes: es decir, cuando ha encontrado su posición en la sección ordenada. La clasificación de burbujas requiere que el intercambio continúe hasta que el elemento más grande de la sección sin clasificar llega a la sección clasificada, por lo que nunca terminará antes. Sin embargo, es un resumen fantástico, así que +1
Migwell
4
Creo que esta debería ser la mejor respuesta :)
Adelin
2
Más 1 por la claridad, el valor didáctico y por los principales invariantes del ciclo de cada algoritmo. Es una lástima que no contenga explícitamente la comparación de la complejidad (expresada en función de n ), de todos modos la considero una mejor respuesta que la aceptada, ya que de esto puedo ver la diferencia.
Honza Zidek
¿Puedo preguntar por qué cambia su artículo en su pseudocódigo de inserción en cada paso? if (a [j-1]> a [j]) entonces a [j] = a [j-1] ELSE if (a [j-1] <e && a [j]> e) que a [j] = e; romper; , donde e es el elemento que debe ordenarse. Con esta solución, no intercambia elementos ya ordenados, solo los copia. Espero tener tu explicación, ya que estoy un poco confundido.
Karoly
@Karoly, elegí mi versión porque es más simple. El tuyo es un poco más rápido, es bueno que lo señales. Wikipedia describe ambas versiones.
Tom
16

Otra diferencia, no vi aquí:

La clasificación de burbujas tiene 3 asignaciones de valor por intercambio : primero debe construir una variable temporal para guardar el valor que desea impulsar (número 1), luego debe escribir la otra variable de intercambio en el lugar donde acaba de guardar el valor de (n. ° 2) y luego debe escribir su variable temporal en el lugar otro lugar (n. ° 3). Tienes que hacer eso para cada lugar (quieres avanzar) para ordenar tu variable en el lugar correcto.

Con la ordenación por inserción , coloca su variable para ordenar en una variable temporal y luego coloca todas las variables delante de ese lugar 1 lugar al revés, siempre que llegue al lugar correcto para su variable. Eso hace 1 asignación de valor por lugar . Al final, escribe su variable temporal en el lugar.

Eso también hace asignaciones de mucho menos valor.

Este no es el mayor beneficio de velocidad, pero creo que se puede mencionar.

Espero, me expresé comprensible, si no, lo siento, no soy un nativo de Gran Bretaña

usuario5269260
fuente
1
"y luego poner todas las variables delante de ese punto 1 punto al revés" - ¿y eso no requiere también una gran cantidad de asignaciones para cambiar los datos? (asumiendo que los datos se almacenan de forma contigua de todos modos, no una lista vinculada)
Mark K Cowan
@MarkKCowan, sí, ahí es donde la ordenación por inserción hace la asignación por 'lugar' como lo expresó el usuario anterior. Básicamente, la ordenación por inserción se puede escribir con una asignación en el bucle interno, mientras que bubblesort tiene 3 asignaciones en el bucle interno.
JSQuareD
9

La principal ventaja de la ordenación por inserción es que es un algoritmo en línea. No es necesario que tenga todos los valores al principio. Esto puede resultar útil cuando se trata de datos procedentes de la red o de algún sensor.

Tengo la sensación de que esto sería más rápido que otros n log(n)algoritmos convencionales . Porque la complejidad sería, por n*(n log(n))ejemplo, leer / almacenar cada valor de stream ( O(n)) y luego ordenar todos los valores ( O(n log(n))) resultando enO(n^2 log(n))

Por el contrario, el uso de Insertar ordenación necesita O(n)leer valores de la secuencia y O(n)colocar el valor en el lugar correcto, por lo que es O(n^2)solo. Otra ventaja es que no necesita búferes para almacenar valores, los ordena en el destino final.

jnovacho
fuente
Si está bien que un recorrido en orden de los datos sea algo más que simplemente escanear una matriz, puede ordenar sobre la marcha de manera mucho más eficiente. por ejemplo, inserte elementos en un árbol binario a medida que los reciba. Esto le brinda el O(n log(n))trabajo total realizado para tener una colección ordenada en cada paso del camino. (Un recorrido en orden en cualquier punto es O(m)). Si solo necesita un resultado ordenado al final, pero desea superponer el cálculo de clasificación con el tiempo de transferencia de los datos, un montón puede ser bueno. (Y funciona en el lugar, como inserción-ordenación).
Peter Cordes
De todos modos, ni la clasificación por burbujas ni la clasificación por inserción son ideales para esto con tamaños de problemas lo suficientemente grandes como para que la O(f(n))clase de complejidad importe más que los detalles de implementación y los factores constantes.
Peter Cordes
Corrección: un montón no es bueno para esto. Realiza la mayor parte del trabajo de clasificación a medida que elimina elementos en orden ordenado, razón por la cual el cultivo es tan barato. El objetivo aquí es tener la mayor parte del trabajo terminado para cuando llegue el último elemento.
Peter Cordes
De todos modos, si necesita mantener una matriz ordenada para las ninserciones, entonces realmente se reduce a qué algoritmo es mejor para ordenar una matriz casi ordenada donde hay un elemento no ordenado en la parte superior. Muchos O(n log(n))algoritmos de clasificación están O(n)en el caso casi ordenado, por lo que no es cierto que necesite sum(M=1..n, O(M * log(M)) )trabajar. Eso sería de hecho O(n^2 log(n)), pero con la elección correcta de algoritmo, serán O(n^2)un trabajo total. Sin embargo, la ordenación por inserción es la más eficiente para esto.
Peter Cordes
7

Bubble Sort no está en línea (no puede ordenar un flujo de entradas sin saber cuántos elementos habrá) porque realmente no realiza un seguimiento de un máximo global de elementos ordenados. Cuando se inserta un artículo, deberá comenzar a burbujear desde el principio

Joe Tam
fuente
4

Bueno, la clasificación por burbujas es mejor que la clasificación por inserción solo cuando alguien está buscando los k elementos principales de una lista grande de números, es decir, en la clasificación por burbujas después de k iteraciones obtendrá los k elementos principales. Sin embargo, después de k iteraciones en la ordenación por inserción, solo asegura que esos k elementos estén ordenados.

Rajat Paliwal
fuente
2

Aunque ambos tipos son O (N ^ 2). Las constantes ocultas son mucho más pequeñas en el tipo de inserción. Las constantes ocultas se refieren al número real de operaciones primitivas realizadas.

¿Cuándo la ordenación por inserción tiene un mejor tiempo de ejecución?

  1. La matriz está casi ordenada: observe que la ordenación por inserción realiza menos operaciones en este caso que la ordenación por burbujas.
  2. La matriz es de tamaño relativamente pequeño: la ordenación por inserción mueve los elementos para colocar el elemento actual. Esto solo es mejor que la ordenación por burbujas si el número de elementos es reducido.

Tenga en cuenta que la ordenación por inserción no siempre es mejor que la ordenación por burbujas. Para obtener lo mejor de ambos mundos, puede usar la ordenación por inserción si la matriz es de tamaño pequeño, y probablemente fusionar ordenación (o ordenación rápida) para matrices más grandes.

Aravind
fuente
2
Si el número de elementos no es pequeño, ¿cómo sería mejor la clasificación de burbujas? Tengo entendido que si se desliza en IS o cambia en BS dependerá de si el elemento comparado es mayor (IS) o menor (BS) y no del número de elementos. Por favor corríjame si está mal.
Mustafa
0

La clasificación de burbujas es casi inútil en todas las circunstancias. En los casos de uso en los que el ordenamiento por inserción puede tener demasiados intercambios, se puede utilizar el ordenamiento por selección porque garantiza menos de N veces de intercambio. Dado que el ordenamiento por selección es mejor que el ordenamiento por burbujas, el ordenamiento por burbujas no tiene casos de uso.

DChen
fuente
0

Número de intercambio en cada iteración

  • Insertion-sort hace como máximo 1 intercambio en cada iteración .
  • Bubble-sort realiza intercambios de 0 an en cada iteración.

Acceder y cambiar la parte clasificada

  • La ordenación por inserción accede (y cambia cuando es necesario) la parte ordenada para encontrar la posición correcta de un número en consideración.
  • Cuando está optimizado, Bubble-sort no accede a lo que ya está ordenado.

En línea o no

  • La ordenación por inserción está en línea. Eso significa que la ordenación por inserción toma una entrada a la vez antes de colocarla en la posición adecuada. No tiene por qué comparar solo adjacent-inputs.
  • Bubble-sort no está en línea. No opera una entrada a la vez. Maneja un grupo de entradas (si no todas) en cada iteración. La clasificación de burbujas solo compara e intercambiaadjacent-inputs en cada iteración.
shuva
fuente
0

tipo de inserción:

1.En la clasificación de inserción no se requiere el intercambio.

2.La complejidad de tiempo de la ordenación por inserción es Ω (n) para el mejor de los casos y O (n ^ 2) para el peor de los casos.

3. menos complejo en comparación con el tipo de burbuja.

4.ejemplo: insertar libros en la biblioteca, ordenar tarjetas.

clasificación de burbujas: 1.Se requiere intercambio en la clasificación de burbujas.

2.La complejidad temporal de la clasificación de burbujas es Ω (n) para el mejor de los casos y O (n ^ 2) para el peor de los casos.

3.más complejo en comparación con el tipo de inserción.

abhishek agrawal
fuente
1
¿Por qué no se requiere el intercambio? Intercambia elementos para poner un elemento en la posición correcta. Y no diría que el tipo de burbuja es más complejo.
parsecer
-1

La ordenación por inserción se puede reanudar como " Busque el elemento que debería estar en la primera posición (el mínimo), haga algo de espacio cambiando los elementos siguientes y colóquelo en la primera posición. Bien. Ahora mire el elemento que debería estar en la 2ª. ... "y así sucesivamente ...

La clasificación de burbujas funciona de manera diferente, lo que puede reanudarse como " Siempre que encuentre dos elementos adyacentes que estén en el orden incorrecto, los cambio ".

UmNyobe
fuente
Eso ayuda con la ordenación por inserción, pero su explicación de la ordenación de burbujas no incluye los bucles reales, por lo que realmente no puedo compararlos. La ordenación por inserción también tiene la regla. Siempre que encuentre dos elementos adyacentes que estén en el orden incorrecto, los cambio , lo que es diferente es la forma en que operan los bucles.
Migwell
3
¿No es ese tipo de selección?
harold
Oh, sí, eso es cierto ^
Migwell