|
QUICKSORTEl algoritmo quick sort se basa en la estrategia divide-y-vencerás, porque divide el problema en dos subproblemas, que se resuelven de manera individual e independiente. Los resultados se unen después. Dado un conjunto de números a1, a2,..., an, se escoge un elemento X para dividir dicho conjunto en dos listas, como se muestra a continuación: Después de la división, el quick sort puede aplicarse en forma recursiva tanto a L1 como a L2, con lo cual se obtiene una lista ordenada, ya que L1 contiene a todos los a¡ menores que o iguales a X y L2 contiene a todos los ai mayores que X. Quicksort(arreglo a, int f, int l) {
} El siguiente ejemplo, ilustra el algoritmo: El mejor caso de quick sort ocurre cuando X divide la lista justo en el centro. Es decir, X produce dos sublistas que contienen el mismo número de elementos. En este caso, la primera ronda requiere n pasos para dividir la lista original en dos listas. Para la ronda siguiente, para cada sublista, de nuevo se necesitan n/2 pasos (ignorando el elemento usado para la división). En consecuencia, para la segunda ronda nuevamente se requieren 2 • (n/2) = n pasos. Si se supone que n = 2^P, entonces en total se requieren p*n pasos. Sin embargo, p = log2 n. Así, para el mejor caso, la complejidad temporal del quick sort es O(n log n). El peor caso del quick sort ocurre cuando los datos de entrada están ya ordenados o inversamente ordenados. En estos casos, todo el tiempo simplemente se está seleccionando el extremo (ya sea el mayor o el menor). Por lo tanto, el número total de pasos que se requiere en el quick sort para el peor caso es:
De igual manera, se procede para hacer un análisis al algoritmo de Mergesort. Ejercicio: Demuestre que en quick sort, la pila máxima necesaria es O(log n). |