¿Cuál es más rápido: clasificación rápida o burbuja, y por qué?

Para agregar a la respuesta de Vaibhav Mallya a ¿Cuál es más rápido: clasificación rápida o clasificación de burbujas, y por qué ?: la clasificación de burbujas es realmente más rápida para conjuntos de datos muy pequeños (por ejemplo, 10 elementos, tal vez incluso para 100 elementos, dependiendo de la plataforma). Eso es porque necesita muy pocas operaciones adicionales, tiene poca sobrecarga.

De hecho, es típico que los algoritmos de ordenación recursiva cambien a una ordenación más simple, como la ordenación de burbujas, una vez que el conjunto se ha vuelto lo suficientemente pequeño, por ejemplo, una implementación de la biblioteca de clasificación rápida (o combinación de clasificación, o lo que sea) no se repetiría hasta el caso de la ordenación 2 elementos, pero solo hasta clasificar aproximadamente 10 elementos, y luego usar un algoritmo más simple para el conjunto pequeño. En general, esto puede ser más rápido, ya que los algoritmos recursivos, con toda su elegancia, pueden funcionar mal en pequeños conjuntos de datos.

Ah: y la ordenación de burbujas también es bastante buena para los conjuntos de datos que ya están casi ordenados. Consulte Animaciones de algoritmos de clasificación para obtener una excelente visualización de diferentes algoritmos de clasificación aplicados a diferentes tipos de datos.

Editar: Discusión muy interesante: ¿Qué tiene de malo el tipo burbuja? Se discute el impacto en el rendimiento de cosas como la localidad de la memoria caché y la predicción de sucursales, algunos conocimientos sobre las aplicaciones para la ordenación parcial / incremental, y más. Cosas fascinantes!

No es una mala pregunta, en realidad.

Quicksort (simplificado):

  1. Elija el elemento de partición en la matriz
  2. Asegúrese de que solo los elementos más pequeños que la partición estén a la izquierda
  3. Recurrir en submatrices izquierda, derecha que contienen elementos menores y mayores respectivamente

Ordenamiento de burbuja:

  1. Para cada elemento A en la matriz
  2. —- Para cada elemento B en la matriz
  3. ——– Si el elemento más pequeño de A y B no está a la izquierda, intercambie los dos
  4. —- Si no se han realizado intercambios en esta carrera, hemos terminado.

Entonces, ¿cuáles son los tiempos de ejecución más desfavorables aquí?

  • Quicksort: [matemáticas] n ^ 2 [/ matemáticas]
  • Bubblesort: [matemáticas] n ^ 2 [/ matemáticas]

Quicksort termina siendo … ¿igual de lento? No exactamente. Recuerde que el peor de los casos no siempre es un buen indicador del rendimiento del mundo real. En el caso promedio,

  • Quicksort: [matemáticas] n \ log (n) [/ matemáticas]
  • Bubblesort: [matemáticas] n ^ 2 [/ matemáticas]

Por lo general, esto significa que Quicksort tenderá a ser más rápido que Bubblesort.

Sin embargo, Quicksort maneja mal los casos degenerados: cuando la lista ya está en un orden casi ordenado, Quicksort seguirá recurriendo. Bubblesort se detendrá tan pronto como termine, gracias a la condición (4), haciendo que Bubblesort sea más rápido en tales casos.

Siempre empiezo con una consideración: no compare soluciones si no conoce el problema. Por ejemplo, ¿es mejor ir en automóvil o en bicicleta? No puedo responder hasta que me diga a dónde quiere ir, qué tan rápido quiere ir allí, cuánto quiere gastar … Nunca tomaría el automóvil para un viaje de 1 km a un lugar donde el estacionamiento más cercano está a 150 m. de mi destino, y ahora describo por qué.

Está relacionado con la idea de “gastos generales” a la que se refiere Daniel.

Debe tener en cuenta que la comparación de algoritmos generalmente se realiza en condiciones asintóticas . Esto significa que está asumiendo que sus datos son abundantes, muy abundantes; de hecho, tan abundante que puedes decir que son infinitos.

Con datos infinitos, todas las operaciones de costo fijo (abrir la puerta de su garaje, conducir hasta la carretera, cerrar la puerta, alcanzar el automóvil nuevamente; buscar un estacionamiento, llegar a su destino a pie) eventualmente se vuelven irrelevantes. Lo único que importa es qué tan rápido puede cubrir cualquier distancia dada con un automóvil o la bicicleta, porque esta medida depende del tamaño del problema, que usted supone que crece indefinidamente.

Sin embargo, si los datos son finitos, entonces las cosas pueden ser muy diferentes.

Si los costos fijos de su automóvil ascienden, por ejemplo, a 5 minutos para un viaje de 2 minutos, mientras que en bicicleta toma 7 minutos para el viaje real más aproximadamente cero por encima (puede dejarlo en la cerca a las afueras de su destino), entonces usted puedo decir que, para su problema particular, una bicicleta es tan eficiente como un automóvil . Por supuesto, si tiene en cuenta los costos de combustible y estacionamiento (y salud y contaminación), entonces su bicicleta podría ser no solo equivalente, sino una solución mucho mejor.

Por lo tanto, para comparar dos algoritmos en un problema específico , debe evaluar el tiempo real que lleva resolver el problema con sus implementaciones: la cantidad de operaciones elementales y su costo (por ejemplo, el costo del acceso a la memoria puede ser diferente entre la lista vinculada y formación).

También puede consultar los datos específicos que espera, si sabe de antemano algo al respecto. Un ejemplo: si existe una alta probabilidad de que los datos ya estén casi ordenados, preferirá un algoritmo que aproveche esto. En su caso, bubbleort es lineal para datos ordenados, por lo que puede ser su mejor amigo; por la misma razón, es cuadrático para datos invertidos o aleatorios, por lo tanto, aléjese si es probable que sea así.