Entre la ordenación rápida, la ordenación por inserción y la ordenación en montón, ¿cuál es la mejor para clasificar datos y por qué?

¿Entre aquellos? ¿Por nada? Ninguno tan bien como todos.

Por ejemplo, si sigue agregando y eliminando dentro / fuera de una lista vinculada, el tipo de inserción hará mucho menos trabajo que los demás. Pero si tiene una matriz con una disposición aleatoria de valores, entonces rápido posiblemente funcionará más rápido. Si la matriz ya está ordenada en su mayoría, el montón probablemente superará rápidamente.

Además, ¿qué es más importante? ¿La velocidad? La cantidad de recursos? ¿Cómo se leen / escriben los datos? ¿Debe terminar siempre dentro de un tiempo establecido o podría cambiar mejor velocidad generalmente por un peor rendimiento en algunos casos raros?

No hay “mejor”. Solo mejor para algunas circunstancias. En general, una ordenación rápida tiende a ser lo suficientemente rápida. En promedio, es más rápido que la mayoría, y donde va en forma de pera no es algo que ocurra a menudo.

Aquí está la cosa: Olvídate de tratar de aprender cuál es el mejor. Eso es un arenque rojo. Más bien trate de entender lo que están haciendo. Trata de entender lo que sucederá en varios escenarios. Esto es REALMENTE lo que buscas cuando aprendes algoritmos. No recitarlos, ni siquiera saber cuál usar. Pero mucho más importante es entender por qué funcionan de la manera en que lo hacen. Por la razón expresa de que puede deducir ideas similares sobre otros problemas, cosas diferentes a ordenar una lista de números.

Es decir, aprende a razonar y responder a un problema. Aprendes a entender qué y por qué algo funciona mejor de una manera que de otra. Y por qué los roles pueden revertirse en otras situaciones. De este modo, aprende a “programar”, no solo a escribir código. Porque eso es de lo que se trata la programación, no escribir código que compila, ese es solo el resultado final, no el medio para llegar allí.

Ninguno. Elegiste tres algoritmos diferentes para ordenar los datos. Cada uno de ellos tiene sus ventajas y desventajas. Éstos son algunos de ellos:

Tipo de inserción:

  • (+) más rápido para entradas pequeñas
  • (-) cuadrático para la mayoría de las entradas grandes

Ordenación rápida:

  • (+) rápido para la mayoría de las entradas
  • (+) compatible con caché
  • (-) la versión más simple tiene un peor caso cuadrático
  • (-) la versión garantizada n-log n tiene un rendimiento mucho peor en la práctica
  • (-) la versión aleatoria es solo O (n log n) con alta probabilidad, no ciertamente

HeapSort:

  • (+) O garantizado (n log n)
  • (+) funciona en su lugar, es decir, con O (1) memoria adicional
  • (-) casi siempre se ejecuta en Theta (n log n), incluso si la entrada está ordenada
  • (-) peor rendimiento práctico que QuickSort

Afortunadamente, en la práctica, nadie te obliga a elegir uno de estos tres. En la actualidad, muchas bibliotecas estándar implementan IntroSort como su algoritmo de clasificación predeterminado. Esto resulta ser una combinación de estos tres algoritmos:

  • Comience con QuickSort.
  • En cada rama que resulta ser demasiado profunda (por ejemplo, más profunda que 2 lg n), cambie a HeapSort.
  • En cada rama que sea lo suficientemente corta, termine la clasificación ejecutando InsertSort.

De esta manera, IntroSort suele ser rápido en la práctica y, al mismo tiempo, le ofrece el rendimiento garantizado O (n log n) en el peor de los casos.

La ordenación por inserción es muy sencilla de implementar, no es recursiva, es estable y tiene una complejidad lineal de mejor tiempo ([matemática] \ Omega (n) [/ matemática]) (los valores ya están ordenados). Pero su complejidad promedio es [matemática] O (n ^ 2) [/ matemática] haciéndola inútil para cualquier cosa que no sean pequeños arreglos.

La ordenación del montón es [matemática] \ Theta (n \ lg n) [/ matemática] porque no le importa el estado inicial de la matriz. Su principal ventaja es que puede funcionar en el lugar e implementarse de forma iterativa, sin requisitos de memoria adicionales. En ciertas situaciones de tiempo crítico, su complejidad fija puede ser útil.

La ordenación rápida está en su lugar, pero requiere una pila porque es un algoritmo de divide y vencerás. Es nominalmente [matemática] O (n \ lg n) [/ matemática] pero hay entradas patológicas que pueden ser [matemática] O (n ^ 2) [/ matemática].

No existe un “mejor” algoritmo: cada uno tiene sus ventajas y desventajas. La complejidad puede ser una medición pobre, ya que a menudo los factores constantes dominan para entradas pequeñas. La memoria también es un factor, como lo es la recursividad. Además, todas estas complejidades se basan en un modelo de procesador único: agregar procesadores adicionales (hilos) puede cambiar las complejidades significativamente.

Si los valores de entrada tienen un rango fijo y el rango es pequeño en comparación con el número de elementos, los tipos de no comparación como radix pueden superar a todos estos. Y si tienes una computadora, el tipo ladrillo los avergüenza a todos.

Por otro lado, hay una serie de “peores” algoritmos: la clasificación del sueño y la clasificación de Bogo vienen a la mente. Pero esos son intencionalmente malos.

Como la complejidad temporal de un algoritmo cuantifica la cantidad de tiempo que tarda un algoritmo en ejecutarse en función de la longitud de la entrada y, de manera similar, la complejidad espacial de un algoritmo cuantifica la cantidad de espacio o memoria que un algoritmo necesita para ejecutarse como una función de la entrada lengyb, por lo tanto, en un logaritmo de clasificación, es la manera de poner los elementos de una lista en un cierto orden. La clasificación de inserción es la mejor información de clasificación porque, a pesar de ser el algoritmo de clasificación menos eficiente, se está compensando por su adaptabilidad.

More Interesting

¿Cuál es el mejor libro de texto en línea gratuito para Algorithm an Data Structure? Me refiero a un libro de texto para un estudiante principiante en la universidad.

¿Cuál es la explicación intuitiva de agregar bordes traseros en el gráfico en el algoritmo Ford-Fulkerson?

¿Por qué se garantiza que la liebre y la tortuga se encontrarán en el algoritmo de detección de ciclos de Floyd?

¿Dónde puedo obtener el algoritmo de 'Biblioteca de Babel'?

¿Los algoritmos de aprendizaje profundo representan métodos basados ​​en conjuntos?

¿Es cierto que dado cualquier gráfico con N vértices es un subgrafo inducido del subconjunto gráfico (N). ¿Cómo puedes probarlo o refutarlo?

Cómo evitar buscar directamente una solución al resolver problemas de algoritmos

¿Necesito conocer algoritmos de aprendizaje automático para asegurar un trabajo como analista de datos?

¿Cuál es la diferencia entre un tipo estable e inestable?

¿Cuáles son las diferencias entre los algoritmos que realizan la búsqueda en un gráfico y los algoritmos que realizan la búsqueda en un árbol?

Cómo diseñar una estructura de datos que pueda almacenar 1-1000 números

¿En qué paso de la prueba del algoritmo de Dijkstra utilizamos el hecho crucial de que los bordes no son negativos?

¿Qué es un algoritmo basado en población? ¿Cuál es el propósito de esto?

¿Alguien ha implementado algoritmos de detección de ECG en un microcontrolador para la detección PQRS?

¿Qué algoritmo de búsqueda usa True caller?