09.05.2013 Views

Algoritmos y Programación en Pascal

Algoritmos y Programación en Pascal

Algoritmos y Programación en Pascal

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

18.3. Reglas prácticas para hallar el coste de un programa 415<br />

Elegir un elem<strong>en</strong>to p (pivote) de v<br />

para cada elem<strong>en</strong>to del vector hacer<br />

si el elem<strong>en</strong>to < p <strong>en</strong>tonces<br />

Colocar el elem<strong>en</strong>to <strong>en</strong> A, el subvector con los elem<strong>en</strong>tos de v<br />

m<strong>en</strong>ores que p<br />

<strong>en</strong> otro caso<br />

Colocar el elem<strong>en</strong>to <strong>en</strong> B, el subvector con los elem<strong>en</strong>tos de v<br />

mayores que p<br />

Como se dijo <strong>en</strong> 15.2.4, se ha optado por elegir como pivote el primer elem<strong>en</strong>to<br />

del vector.<br />

En el peor caso (cuando el vector se <strong>en</strong>cu<strong>en</strong>tra ord<strong>en</strong>ado decreci<strong>en</strong>tem<strong>en</strong>te),<br />

el algoritmo Quick Sort va a t<strong>en</strong>er complejidad O(n 2 ). La razón es que, <strong>en</strong> tal<br />

caso, el cuerpo del bucle para cada elem<strong>en</strong>to. . . se ejecutará, <strong>en</strong> total, (n −<br />

1) + (n − 2) + . . . + 1 veces, donde cada sumando provi<strong>en</strong>e de cada una de las<br />

sucesivas ord<strong>en</strong>aciones recursivas del subvector A. Esto es así porque <strong>en</strong> cada<br />

llamada se ord<strong>en</strong>a un solo elem<strong>en</strong>to (el pivote), y por tanto dicho subvector<br />

t<strong>en</strong>drá sucesivam<strong>en</strong>te longitud (n − 1), (n − 2), . . . , 1. Dicha suma, como se vio<br />

anteriorm<strong>en</strong>te es<br />

n(n − 1)<br />

2<br />

y por tanto el algoritmo ti<strong>en</strong>e complejidad cuadrática. En resum<strong>en</strong>, la complejidad<br />

<strong>en</strong> el peor caso es la misma <strong>en</strong> el algoritmo anterior.<br />

Ciertam<strong>en</strong>te, <strong>en</strong> el capítulo 15 se pres<strong>en</strong>tó este último método como mejora<br />

<strong>en</strong> el tiempo de ejecución. Lo que ocurre es que esa mejora es la que se logra <strong>en</strong><br />

el caso medio. Sin embargo, el correspondi<strong>en</strong>te cálculo rebasa las pret<strong>en</strong>siones<br />

de este libro.<br />

Para completar este apartado se pres<strong>en</strong>ta el análisis de la complejidad <strong>en</strong><br />

tiempo de un tercer algoritmo de ord<strong>en</strong>ación de vectores, concretam<strong>en</strong>te el de<br />

ord<strong>en</strong>ación por mezcla o Merge Sort (véase el apartado 15.2.5). El algoritmo es<br />

el que sigue:<br />

si v es de tamaño 1 <strong>en</strong>tonces<br />

v ya está ord<strong>en</strong>ado<br />

si no<br />

Dividir v <strong>en</strong> dos subvectores A y B<br />

fin {si}<br />

Ord<strong>en</strong>ar A y B usando Merge Sort<br />

Mezclar las ord<strong>en</strong>aciones de A y B para g<strong>en</strong>erar el vector ord<strong>en</strong>ado.

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

Saved successfully!

Ooh no, something went wrong!