¿Hay alguna manera de crear una matriz que haga que el ordenamiento rápido haga O (n ^ 2)?

El peor caso para la clasificación rápida es cuando selecciona un pivote que es el número más pequeño en el rango o el número más grande en el rango. ¿Por qué?

Sea [math] T (n) [/ math] la cantidad de trabajo necesaria para ejecutar la clasificación rápida en números [math] n [/ math]. En este caso, nuestro pivote nos da subrangos de tamaño [matemática] 0 [/ matemática] y [matemática] n-1 [/ matemática], por lo que tenemos una recurrencia que es [matemática] T (n) = T (0) + T (n-1) + O (n) [/ matemática], que tiene solución [matemática] T (n) = O (n ^ 2) [/ matemática].

Una razón informal por la cual quicksort se ejecuta en [math] O (n \ log n) [/ math] en expectativa es que el pivote, en expectativa, divide el rango dado en dos subranges algo equilibrados. Puede probar que incluso si la división es [matemática] \ dfrac {n} {100} [/ matemática] y [matemática] \ dfrac {99n} {100} [/ matemática] o incluso fracciones constantes más absurdas de [matemática] n [/ math], quicksort todavía se ejecuta en [math] O (n \ log n) [/ math].

Entonces la pregunta sigue siendo, ¿puedes forzar la ejecución rápida en [math] O (n ^ 2) [/ math]?

Si quicksort se implementa de manera no determinista, entonces NO . No puede garantizar que las selecciones de pivote sean malas para cada llamada.

Si quicksort se implementa de manera determinista con una selección ingenua del pivote, la respuesta es (sin embargo, vea la respuesta de Anand Oza para obtener una respuesta NO ). Como puede seleccionar la configuración original de la matriz, puede seleccionar un pivote que genera una división que es [matemática] 0 [/ matemática] y [matemática] n-1 [/ matemática]. Luego, en la división [matemática] n-1 [/ matemática], puede organizar esos números de modo que el pivote genere la peor división posible. Continúe esto hasta el final.

Resulta que esto es un gran problema para los codificadores de Java que están ordenando matrices primitivas. Hace unos meses, alguien descubrió cómo hacer que Java 7 QuickSort se ejecute en [math] O (n ^ 2) [/ math] time (consulte [Java] Java 7 Quicksort Killer – Pastebin.com para más detalles). Esto causó que los codificadores de Java que estaban clasificando matrices primitivas tuvieran que barajar sus matrices de entrada o convertirlas en objetos de clasificación, lo que se hace con mergesort en su lugar (esto se hace en el contexto de concursos de programación, donde se espera que se ejecuten muchos algoritmos en [ matemática] O (n \ log n) [/ matemática] con la sobrecarga de la clasificación, por lo que se necesita una ordenación [matemática] O (n \ log n) [/ matemática] sobre una [matemática] O (n ^ 2) [ / math] sort).

No , no si quicksort se implementa de cierta manera.

Para ampliar la respuesta del usuario de Quora a ¿Hay una manera de crear una matriz que haga que el ordenamiento rápido haga O (n ^ 2) ?, mientras que las implementaciones comunes de ordenamiento rápido pueden verse obligadas a tomar tiempo cuadrático, en realidad es posible implementar el ordenamiento rápido de tal manera que deterministamente toma [math] \ mathcal {O} (n \ log n) [/ math] tiempo.

Primero, notamos que quicksort es rápido siempre que los pivots se elijan razonablemente bien, y el mejor de los casos es cuando elegimos los pivots para siempre dividirnos a medias; es decir, elegimos la mediana como pivote cada vez. Podemos encontrar la mediana utilizando el algoritmo de selección de mediana de medianas, que se ejecuta en tiempo lineal para cada pasada, al igual que la partición, por lo que no aumenta nuestro tiempo de ejecución asintótico.

Una vez que hacemos esto, tenemos una versión determinista de quicksort que nunca (no solo casi nunca, como con la versión aleatoria) degenerará a tiempo cuadrático, independientemente de la entrada. [1]

[1] En la práctica, sin embargo, generalmente las personas usan la versión determinista vulnerable de quicksort, o la aleatorizada para ser más segura, porque hay una sobrecarga sustancial en el algoritmo determinista O (n log n) (a pesar de ser asintóticamente el mejor).

El peor de los casos depende de la elección del elemento pivote. Elegir un elemento pivote que ya está en la ubicación correcta (quiero decir, en la ubicación ordenada correcta) es una mala elección.

Entonces, el peor caso para la ordenación rápida es cuando la matriz ya está en el orden ordenado .

(Incluso este enlace http://mathworld.wolfram.com/Qui … menciona lo mismo)

No si el pivote se elige al azar. Si el pivote se elige de una manera fija anterior (por ejemplo, el elemento más a la izquierda de la matriz secundaria correspondiente se elige como el pivote), entonces, en ciertas permutaciones de la entrada, el ordenamiento rápido puede tomar [matemática] O (n ^ 2) [ / matemáticas] tiempo.

El peor de los casos ocurre cuando el elemento pivote divide la matriz de la manera más asimétrica, es decir, cuando uno de los subconjuntos obtenidos después de pivotar es nulo.

Considere el caso cuando la matriz está perfectamente ordenada y el elemento pivote se elige como el primer elemento más de esa matriz. Luego, cada división divide una matriz de tamaño N en dos matrices, una de las cuales tiene tamaño 0 y la otra tiene tamaño N-1. Esto tomaría un total de N iteraciones para terminar dando una complejidad de tiempo de O (n ^ 2).

More Interesting

¿Para qué fines es útil la teoría de la información?

¿Por qué el problema abierto de P vs PSPACE no es tan importante como P vs NP dado que NP está contenido en PSPACE?

¿Cómo calculamos la complejidad del espacio?

¿Cuál es la mejor respuesta de columna o línea tabular que daría para diferenciar y explicar varias licencias de software?

¿Para qué sirve el hash con un software al descargarlo?

Informática: ¿Cuáles son las ventajas y desventajas de la arquitectura von Neumann frente a la arquitectura de Harvard?

¿Cómo puedes usar una computadora?

¿Cómo funcionaba la computadora de guía Apollo con tan poco poder de procesamiento?

¿Qué puedo hacer para reducir el correo electrónico no deseado que he recibido últimamente? Más información en comentarios.

¿Qué tipo de semiosis ocurre dentro de una computadora?

¿Cómo podemos usar la inteligencia artificial para ayudarnos a corregir nuestros prejuicios?

¿Cuánto tiempo le tomará a un estudiante indio en los Estados Unidos con un préstamo estudiantil de $ 70k pagarlo después de obtener un trabajo, en promedio?

Cómo comenzar a participar en la investigación de interacción humano-computadora como estudiante universitario

Soy maestra de escuela y la biología es mi asignatura. Quiero enseñar a los niños de una manera realmente interesante para que puedan entender el concepto y no olvidarlo a lo largo de su vida. Planeé convertir las lecciones en videos de animación y no sé cómo crear eso. ¿Cómo puedo hacer esto?

¿Qué es la inteligencia artificial paralela?