La clasificación es uno de los aspectos fundamentales de la informática.
A lo largo de la breve historia de la informática, los algoritmos de clasificación maduraron a un ritmo rápido y desde los primeros días las computadoras comenzaron a utilizar métodos sofisticados para clasificar los elementos en una estructura de recopilación de datos.
Muchas cosas afectan nuestra elección de usar un algoritmo de clasificación como la cantidad de elementos, el espacio disponible, el presupuesto, las prioridades en nuestra aplicación, etc.
- ¿Cuáles son las mejores visualizaciones de algoritmos de aprendizaje automático?
- Cómo diseñar un algoritmo de movimiento para un robot hexápodo
- ¿Cuál es la mejor manera de ordenar una matriz de objetos en javascript?
- ¿Qué debo hacer para mejorar el pensamiento algorítmico, especialmente para la programación dinámica?
- ¿Por qué Google todavía muestra el tiempo de búsqueda en la página de resultados?
Tratemos de verlos uno por uno:
- Tipo de selección
La selección de selección es una excepción en nuestra lista. Esto se considera un algoritmo de clasificación académica. ¿Por qué? Porque la eficiencia del tiempo es siempre O (n ^ 2), lo cual no es aceptable. No hay uso en el mundo real para el tipo de selección, excepto aprobar el examen del curso de estructura de datos.
pros:
Nada
contras:
Ejecutar siempre en O (n2) incluso en el mejor de los casos
Uso práctico:
Ayude a los estudiantes a obtener algunos créditos para su título, nada para ser precisos
- Ordenamiento de burbuja
Esta es la otra excepción en la lista porque el ordenamiento de burbujas es demasiado lento para ser práctico. A menos que la secuencia esté casi ordenada, la factibilidad de la clasificación de burbujas es cero y el tiempo de ejecución es O (n ^ 2). Este es uno de los tres algoritmos de ordenamiento simples junto con el ordenamiento por selección y el ordenamiento por inserción, pero al igual que el ordenamiento por selección no alcanza el ordenamiento por inserción en términos de eficiencia incluso para secuencias pequeñas.
pros:
De nuevo nada, tal vez solo “pegadizo nombre1”
contras:
Con el polinomio O (n2) es demasiado lento
Uso práctico:
Implementarlo es un ejercicio de programación interesante.
- Tipo de inserción
El tipo de inserción definitivamente no es el algoritmo más eficiente, pero su poder radica en su simplicidad. Dado que es muy fácil de implementar y adecuadamente eficiente para un pequeño número de elementos, es útil para aplicaciones pequeñas o triviales. La definición de pequeño es vaga y depende de muchas cosas, pero una apuesta segura es que si es menor de 50, el tipo de inserción es lo suficientemente rápido. Otra situación en la que es útil la ordenación por inserción es cuando la secuencia está casi ordenada. Tales secuencias pueden parecer excepciones, pero en las aplicaciones del mundo real a menudo se encuentran elementos casi ordenados. El tiempo de ejecución de la ordenación de inserciones es O (n ^ 2) en el peor de los casos. Hasta ahora tenemos otra alternativa inútil para el tipo de selección. Pero si se implementa bien, el tiempo de ejecución se puede reducir a O (n + k). n es el número de elementos yk es el número de inversiones (el número de pares de elementos fuera de orden). Con este nuevo tiempo de ejecución en mente, puede ver si la secuencia está casi ordenada (k es pequeña), el tiempo de ejecución puede ser casi lineal, lo que es una gran mejora sobre el polinomio n ^ 2.
pros:
Fácil de implementar
Cuanto más ordenada está la secuencia, más cerca está el tiempo de ejecución del tiempo lineal O (n)
contras:
No es adecuado para grandes conjuntos de datos.
Todavía polinomio en el peor de los casos
Uso práctico
Para aplicaciones pequeñas cuando la secuencia es pequeña (menos de 50 elementos)
Cuando la secuencia va a estar casi ordenada
- Tipo de montón
Este es el primer algoritmo de clasificación de propósito general que presentamos aquí. La ordenación del montón se ejecuta en O (nlogn), lo cual es óptimo para los algoritmos de ordenación basados en la comparación. Aunque la ordenación en montón tiene el mismo tiempo de ejecución que la ordenación rápida y la ordenación por fusión, generalmente se supera en escenarios del mundo real. Si se pregunta por qué alguien debería usarlo, la respuesta está en la eficiencia del espacio. Hoy en día las computadoras vienen con una gran cantidad de memoria, suficiente para muchas aplicaciones. ¿Esto significa que el montón está perdiendo su brillo? No, aún cuando se escriben programas para entornos con memoria limitada, como sistemas integrados o eficiencia de espacio, es mucho más importante que la eficiencia de tiempo. Una regla general es que si la secuencia es lo suficientemente pequeña como para caber fácilmente en la memoria principal, entonces la ordenación del montón es una buena opción.
pros:
Se ejecuta en O (nlogn)
Se puede implementar fácilmente para ejecutarse en el lugar
contras:
No es tan rápido como otros algoritmos basados en comparación en grandes conjuntos de datos
No proporciona una clasificación estable
Uso práctico:
La elección natural para secuencias pequeñas y medianas
Si se trata del tamaño de la memoria principal, la mejor opción es la ordenación del montón
- Ordenación rápida
Uno de los algoritmos de clasificación más utilizados en la industria informática. El ordenamiento sorprendentemente rápido tiene un tiempo de ejecución de O (n ^ 2) que lo hace susceptible en aplicaciones en tiempo real. Tener un polinomio en el peor de los casos, la ordenación rápida sigue superando tanto la ordenación rápida como la ordenación por fusión (a continuación). La razón detrás de la popularidad de la clasificación rápida a pesar de las deficiencias es tanto la rapidez en los escenarios del mundo real (no necesariamente el peor de los casos) como la capacidad de implementarse como un algoritmo en el lugar.
pros:
La mayoría de las veces se ejecuta en O (nlogn)
La clasificación rápida se ha probado y es verdadera, se ha utilizado durante muchos años en la industria, por lo que puede estar seguro de que no le fallará
Alta eficiencia espacial al ejecutar en el lugar
contras:
El peor escenario polinómico lo hace susceptible a aplicaciones de tiempo crítico
Proporciona ordenación no estable debido al intercambio de elementos en el paso de partición
Uso práctico:
La mejor opción para uso general y en clasificación de memoria
Solía ser el algoritmo estándar para clasificar matrices de tipos primitivos en Java
La utilidad qsort en lenguaje de programación C funciona con ordenación rápida
- Ordenar fusión
Tener un tiempo de ejecución de O (nlogn) en el peor de los casos hace que la fusión sea un poderoso algoritmo de clasificación. El principal inconveniente de este algoritmo es su ineficiencia espacial. Eso está en el proceso de clasificar muchas matrices temporales que deben crearse y muchas copias de elementos están involucradas. Esto no significa que la ordenación por fusión no sea útil. Cuando los datos que se ordenarán se distribuyen en diferentes ubicaciones como caché, memoria principal, etc., es inevitable copiar datos. La clasificación por fusión principalmente debe su popularidad a Tim Peters, quien diseñó una variante de la misma que es esencialmente una clasificación por fusión de abajo hacia arriba y se conoce como clasificación por Tim.
pros:
Excelente opción cuando los datos se obtienen de recursos distintos de la memoria principal
Tener un peor escenario de tiempo de ejecución de O (nlogn) que es óptimo
La variante de clasificación de Tim es realmente poderosa
contras:
Muchos gastos generales al copiar datos entre matrices y hacer nuevas matrices
Extremadamente difícil de implementar en su lugar para matrices
Ineficiencia espacial
Uso práctico:
Cuando los datos están en diferentes ubicaciones como caché, memoria principal, memoria externa, etc.
Se utiliza una variante de clasificación de combinación múltiple en la utilidad de clasificación de GNU
La variante de clasificación de Tim es un algoritmo de clasificación estándar en lenguaje de programación Python desde 2003
Algoritmo de clasificación predeterminado de matrices de tipo de objeto en Java desde la versión 7 en adelante
- Algoritmos de clasificación de propósito especial
Aunque actualmente O (nlogn) parece un límite irrompible para los algoritmos de clasificación, esto solo es cierto para los propósitos generales. Si las entidades que se ordenarán son números enteros, cadenas o d-tuplas, entonces no está limitado por los algoritmos de clasificación anteriores. Radix sort y Bucket sort son dos de los algoritmos de clasificación de propósito especial más famosos. su peor caso de ejecución es O (f (n + r)). [0, r-1] es el rango de enteros yf = 1 para la clasificación de cubetas. En general, esto significa que si f (n + r) está significativamente por debajo de la función nlogn, entonces estos métodos son más rápidos que tres potentes algoritmos de clasificación de propósito general, clasificación de fusión, clasificación rápida y clasificación de montón.
pros:
Pueden correr más rápido que nlogn
contras:
No se puede utilizar para todo tipo de datos.
No necesariamente siempre se ejecuta más rápido que los algoritmos de propósito general
Uso práctico:
Cuando se cumplen los requisitos previos de los tipos de datos, son la elección definitiva.