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.

414 Capítulo 18. Complejidad algorítmica<br />

Para empezar, se pres<strong>en</strong>ta el algoritmo de ord<strong>en</strong>ación por intercambio directo<br />

(véase el apartado 15.2.3), que es fácil pero inefici<strong>en</strong>te, como se demostrará al<br />

estudiar su complejidad y compararla con la de los restantes. Como se explicó <strong>en</strong><br />

dicho apartado, este algoritmo consiste <strong>en</strong> recorrer el array con dos bucles anidados<br />

dep<strong>en</strong>di<strong>en</strong>tes. El primero recorre todos los elem<strong>en</strong>tos del vector, mi<strong>en</strong>tras que<br />

el segundo bucle va intercambiando los valores que están <strong>en</strong> ord<strong>en</strong> decreci<strong>en</strong>te.<br />

El boceto del algoritmo es el sigui<strong>en</strong>te:<br />

para i <strong>en</strong>tre 1 y n-1 hacer<br />

Desplazar el m<strong>en</strong>or valor desde vn hasta vi, intercambiando<br />

pares vecinos, si es necesario<br />

Devolver v ya ord<strong>en</strong>ado<br />

Como siempre, para determinar la complejidad es necesario contar el número<br />

de veces que se ejecuta el cuerpo de los bucles, ya que las operaciones que intervi<strong>en</strong><strong>en</strong><br />

<strong>en</strong> el algoritmo (asignaciones, comparaciones y acceso a elem<strong>en</strong>tos de un<br />

vector) se ejecutan <strong>en</strong> tiempo constante.<br />

El cuerpo del bucle Desplazar el m<strong>en</strong>or valor. . . si es necesario requiere n-i<br />

pasos <strong>en</strong> la vuelta i-ésima (uno para cada posible intercambio). Por lo tanto, el<br />

coste del algoritmo completo es 8<br />

n<br />

(n − i) =<br />

i=1<br />

n(n − 1)<br />

2<br />

y, <strong>en</strong> consecu<strong>en</strong>cia, su complejidad es cuadrática (O(n 2 )).<br />

Analicemos ahora el algoritmo Quick Sort (véase el apartado 15.2.4) <strong>en</strong> el<br />

peor caso. A grandes trazos, el algoritmo es el sigui<strong>en</strong>te:<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 bloques A y B<br />

con todos los elem<strong>en</strong>tos de A m<strong>en</strong>ores que los de B<br />

fin {si}<br />

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

Devolver v ya ord<strong>en</strong>ado como concat<strong>en</strong>ación<br />

de las ord<strong>en</strong>aciones de A y de B<br />

donde Dividir v <strong>en</strong> dos bloques A y B consiste <strong>en</strong><br />

8 La suma que hay que calcular se corresponde con la suma de los términos de una progresión<br />

aritmética (véase el apartado 18.4).

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

Saved successfully!

Ooh no, something went wrong!