20.03.2015 Views

Tabla de Contenidos

Tabla de Contenidos

Tabla de Contenidos

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!