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 29<br />
3. Demuestre que para todo P mayor o igual a 0 se cumple<br />
2.3. Quicksort<br />
(P − 1)2 P+1 ≤<br />
P∑<br />
2 p p ≤ P2 P+1 .<br />
En esta sección estudiaremos el algoritmo <strong>de</strong> or<strong>de</strong>nación Quick-Sort que es uno <strong>de</strong> los algoritmos<br />
más eficientes para or<strong>de</strong>nar en un caso promedio (real). Al igual que Merge-Sort, Quick-Sort<br />
usa una estrategia <strong>de</strong>l tipo dividir para conquistar, por lo que es natural plantearlo como un procedimiento<br />
recursivo. La estrategia para or<strong>de</strong>nar el arreglo A[p..r] es la siguiente:<br />
p=0<br />
Divi<strong>de</strong> el arreglo A[p..r] usando un índice q, para obtener A[p..q] y A[q + 1..r], tal que se<br />
cumpla la propiedad<br />
A[p..q] ≤ A[q + 1..r]. (2.3)<br />
Or<strong>de</strong>na recursivamente cada uno <strong>de</strong> las partes A[p..q] y A[q + 1..r].<br />
No necesita mezclar ya que luego <strong>de</strong> or<strong>de</strong>nar recursivamente A[p..q] y A[q + 1..r] por la<br />
propiedad (2.3) anterior, el arreglo A[p..r] resulta or<strong>de</strong>nado.<br />
Debiera quedar claro entonces, dado que no se <strong>de</strong>ben mezclar las soluciones a los subproblemas,<br />
que la mayor parte <strong>de</strong>l trabajo se gastará en encontrar el índice q para particionar el arreglo A <strong>de</strong><br />
manera <strong>de</strong> cumplir la propiedad (2.3). Siguiendo esta estrategia, el código para Quick-Sort es:<br />
Quick-Sort(A,p,r)<br />
if p < r<br />
then q := Partition(A,p,r)<br />
Quick-Sort(A,p,q)<br />
Quick-Sort(A,q + 1,r)<br />
La llamada inicial entonces para or<strong>de</strong>nar el arreglo A es Quick-Sort(A,0,n − 1).<br />
El procedimiento Partition(A,p,r) encuentra un índice q, p ≤ q < r, tal que A[p..q] ≤<br />
A[q + 1..r]. Para hacerlo, elige un pivote <strong>de</strong>ntro <strong>de</strong>l arreglo y luego <strong>de</strong>ja en la parte inicial <strong>de</strong><br />
A[p..r] sólo elementos que sean menores o iguales al pivote, y en la parte final <strong>de</strong> A[p..r] sólo<br />
elementos que sean mayores o iguales que el pivote. En la siguiente implementación <strong>de</strong> Partition<br />
se elige como pivote al primer elemento <strong>de</strong> A[p..r].<br />
Partition(A,p,r)<br />
x := A[p] ✄ Elige a A[p] como pivote<br />
i := p − 1<br />
j := r + 1<br />
while true<br />
do repeat j := j − 1 while A[j] > x<br />
repeat i := i + 1 while A[i] < x<br />
if i < j<br />
then intercambia(A[i],A[j])<br />
else return j