1. Quicksort <br />En esta clase se estudio el algoritmo quicksort, un método para ordenar vectores diseñado por división y conquista. Se explicó que la división del problema en subproblemas se realiza mediante la función partición, que divide el vector que se quiere ordenar en dos segmentos, el uno que contiene elementos menor o igual que el pivote, el otro que contiene elementos mayor o igual que el pivote; el elemento pivote se puede escoger de muchas diferentes maneras, pero en este curso lo vamos a tomar al primer elemento del segmento que se quiere partir. La conquista consiste en ordenar cada uno de los segmentos resultantes de la partición y lo haremos utilizando el mismo método quicksort. El paso de combinación consiste en hacer nada.<br />Luego se explicó la manera en que se realiza la operación partición, y se calculó el tiempo de ejecución de este algoritmo:<br />t(n) pertenece a teta(n)<br />Mas adelante se encontró la ecuación de recurrencia para el tiempo de ejecución del algoritmo quicksort para un caso cualquiera, donde la partición ocurre de tal manera que los subproblemas que resultan son de tamaño k y n-k, respectivamente.<br />t(n) = t(k) + t(n-k) + teta(n)<br />t(1) = 1<br />La segunda ecuación es la condición de borde, que corresponde al caso en que los subproblemas que resultan en el proceso de división son de tamaño 1, para los cuales tomamos el tiempo de ejecución 1 tambien.<br />Resolvimos la ecuación para dos casos particulares: el mejor y el peor de los casos. El mejor de los casos ocurre cuando la partición divide al vector que se ordena por la mitad; entonces k es aproximadamente n/2, y la ecuación de recurrencia queda así:<br />t(n) = 2·t(n/2) + n<br />que es una ecuación que ya hemos resuelto tres veces, cuya solución es <br />t(n) pertenece a teta(n·ln(n))<br />que es el mejor de los tiempos que se puede obtener para ordenar vectores.<br />Luego calculamos el tiempo de ejecución de quicksort para el peor de los casos; este ocurre cuando uno de los segmentos que resultan de la partición tiene un solo elemento y el otro los restantes; la ecuación de recurrencia se reduce entonces a:<br />t(n) = t(1) + t(n-k) + n<br />t(1) = 1<br />Se resolvió esta ecuación por iteración, usando el árbol recursivo, pues no se puede aplicar el teorema maestro, y se obtuvo:<br />t(n) pertenece a teta(n2)<br />Lo que que muestra que en el peor de los casos el algoritmo quicksort se comporta como los métodos mas malos que se conocen para ordenar vectores.<br />Se dijo que el comportamiento promedio de quicksort es como el del mejor de los casos; razón por la cual quicksort es uno de los métodos mas populares; además, su implementación pequeña. <br />qs(A, i, j)<br />si i distinta de j<br />k <- partición(A, i, j)<br />qs(A, i, k)<br />qs(A, k+1, j)<br />Finalmente se elaboró una tabla con los tiempos de ejecución promedio, mejor y peor de los casos, para los métodos de ordenar vectores que se han estudiado hasta ahora.<br />Se enunció la regla de oro que dice que el tiempo promedio de ejecución de un algoritmo tiene el mismo comportamiento que el del peor de los caso; esta regla tiene, sin embargo, excepciones, como en el caso de quicksort.<br /> <br />