Tabla de Contenidos
Tabla de Contenidos
Tabla de Contenidos
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
2.3. QUICKSORT 33<br />
n<br />
Θ(n)<br />
Θ(n)<br />
1 n − 1<br />
n−1<br />
2<br />
n−1<br />
2<br />
⇐⇒<br />
n<br />
n−1<br />
2<br />
+ 1<br />
n−1<br />
2<br />
Figura 2.7: Porción <strong>de</strong>l árbol <strong>de</strong> recursión para Quick-Sort cuando las particiones se producen<br />
intercalando buenas y malas (izquierda), y cómo esta pue<strong>de</strong> representarse por una porción <strong>de</strong> un<br />
árbol con sólo particiones buenas (<strong>de</strong>recha).<br />
Quicksort Aleatorio<br />
Hemos entregado evi<strong>de</strong>ncia acerca <strong>de</strong> que, si todas las posibles entradas son igualmente probables,<br />
entonces Quick-Sort tiene un buen comportamiento esperado, Θ(nlog n). ¿Qué tan razonable es la<br />
suposición <strong>de</strong> que todas las entradas son igualmente probables? Depen<strong>de</strong> <strong>de</strong>masiado <strong>de</strong> la aplicación.<br />
Por ejemplo, suponga una aplicación que or<strong>de</strong>na datos <strong>de</strong> personas por fecha <strong>de</strong> nacimiento, si ocurre<br />
el caso <strong>de</strong> que los datos se encontraban inicialmente or<strong>de</strong>nados por RUT, Quick-Sort tendrá un mal<br />
comportamiento ¿por qué? El caso peor ocurre si quien entrega la entrada es un adversario. Si él sabe<br />
que estamos utilizando Quick-Sort para or<strong>de</strong>nar el arreglo pue<strong>de</strong> forzar un mal comportamiento.<br />
Una alternativa para solucionar estos problemas es, en vez <strong>de</strong> suponer que todas las entradas<br />
son igualmente probables, imponer que todas lo sean. Esto se pue<strong>de</strong> lograr, por ejemplo, haciendo<br />
permutaciones aleatorias <strong>de</strong> los elementos antes <strong>de</strong> comenzar a or<strong>de</strong>narlos. Entonces Quick-Sort<br />
podría obtener un mejor comportamiento esperado si antes <strong>de</strong> comenzar a or<strong>de</strong>nar los valores, se<br />
asegura <strong>de</strong> que estos estén suficientemente “<strong>de</strong>sor<strong>de</strong>nados”, <strong>de</strong>sor<strong>de</strong>nados en el sentidos <strong>de</strong> que no<br />
<strong>de</strong>pendan <strong>de</strong> una aplicación en particular. Importante es notar que esta modificación no mejora el<br />
peor comportamiento <strong>de</strong> Quick-Sort, <strong>de</strong> hecho podría tenerse tan mala suerte que en el proceso<br />
<strong>de</strong> “<strong>de</strong>sor<strong>de</strong>n” el arreglo que<strong>de</strong> ya or<strong>de</strong>nado, en cuyo caso se obtendrá <strong>de</strong> todas maneras un mal<br />
comportamiento. Lo que si estamos seguros que se logra es in<strong>de</strong>pendizarse <strong>de</strong> la fuente <strong>de</strong> datos<br />
<strong>de</strong> entrada, la probabilidad <strong>de</strong> obtener un mal <strong>de</strong>sempeño ya no <strong>de</strong>pen<strong>de</strong>rá <strong>de</strong> la aplicación o <strong>de</strong> si<br />
un adversario es quién provee los datos <strong>de</strong> entrada.<br />
El siguiente algoritmo Rand-Quick-Sort implementa esta i<strong>de</strong>a llamando al procedimiento<br />
Rand-Partition para realizar la partición.<br />
Rand-Quick-Sort(A,p,r)<br />
if p < r<br />
then q := Rand-Partition(A,p,r)<br />
Rand-Quick-Sort(A,p,q)<br />
Rand-Quick-Sort(A,q + 1,r)