Cómo explicar el análisis de casos promedio del algoritmo de ordenación rápida

La ordenación rápida es una ordenación de “divide y vencerás” que funciona creando dos sublistas de una lista y ordenando recursivamente las sublistas. Esto hace que el tiempo de ejecución promedio sea proporcional a N log N donde N es el número de elementos en la lista.

En el peor de los casos, donde el pivote es el elemento mínimo o máximo en la lista cada vez, la ordenación se convierte en una ordenación N ^ 2 pero se ejecuta muy lentamente porque cada elemento individual se ordena recursivamente. Por lo tanto, la selección adecuada del pivote es vital.

Siempre que el elemento sobre el que se divide la lista (el pivote) se elija al azar, se puede esperar una división 3: 1 de la lista (es decir, una sublista contiene 3 veces más elementos que la otra). Esto hace que el tiempo de ejecución sea un poco más largo que un logaritmo de base 2 puro (la base es 1.333) pero aún logarítmico.

Depende de cómo elijamos el pivote.

Imaginemos que es probable que el pivote termine en cualquier lugar de una submatriz de n elementos después de la partición.

Luego, para obtener una división que sea 3 a 1 o mejor, el pivote debería estar en algún lugar de la “mitad media”:

Entonces, si el pivote tiene la misma probabilidad de terminar en cualquier parte de la subcadena después de la partición, hay un 50% de posibilidades de obtener, en el peor de los casos, una división de 3 a 1.

En otras palabras, esperamos una división de 3 a 1 o mejor aproximadamente la mitad del tiempo.

El otro caso que veremos para entender por qué el tiempo promedio de ejecución de caso rápido de quicksort es O (nlogn) es lo que sucedería si la mitad del tiempo que no tenemos una división de 3 a 1, obtuvimos el peor -caja dividida.

Supongamos que las divisiones 3 a 1 y el peor de los casos se alternan, y pensemos en un nodo en el árbol con k elementos en su submatriz.

Entonces veríamos una parte del árbol que se ve así:

Uno más que puedes ver:

Tenga en cuenta que este análisis no es matemáticamente riguroso, pero le da una idea intuitiva de por qué el tiempo de ejecución promedio del caso podría ser O (nlogn).

Gracias.

More Interesting

¿Qué cosas debes saber antes de aprender algoritmos?

¿Dónde debo comenzar una estructura de datos?

¿Por qué no usamos el aprendizaje automático para mejorar los modelos climáticos?

¿En qué se diferencia un árbol de búsqueda binario de un árbol binario?

¿Cuál es un ejemplo de un buen algoritmo que se puede usar para unir a diferentes usuarios dentro de un determinado radio en cualquier ubicación según sus preferencias?

¿Por qué mi solución C ++ al problema SPOJ.com - Problema DIVSUM2 muestra un error?

Siempre sueño con trabajar en grandes empresas tecnológicas como Google o Facebook, pero mi habilidad con los algoritmos es muy débil. Intento resolver problemas en Google Code Jam y CodeChef, pero solo puedo resolver los fáciles. ¿Qué tengo que hacer?

¿Hay alguna prueba de que los algoritmos de clasificación no pueden tener una complejidad mejor que O (Nlog (N))?

¿De qué sirve estudiar algoritmos de clasificación y técnicas de búsqueda? Quiero decir, ¿dónde lo usamos en la programación?

¿Qué tiene más sentido estudiar como programador después de aprender algoritmos básicos?

Cómo encontrar el factorial de un número grande, como 100, en C

Cómo hacer que un algoritmo se visualice como visualgo.net

¿Se puede usar el algoritmo DBSCAN para determinar los límites del área geográfica?

¿Es c * O (n) = O (n) verdadero?

En plataformas de programación competitivas como TopCoder y CodeChef, ¿cómo sé que una competencia o proyecto es bueno para participar?