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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

304 Capítulo 15. <strong>Algoritmos</strong> de búsqueda y ord<strong>en</strong>ación<br />

15.1.2 Búsqueda secu<strong>en</strong>cial ord<strong>en</strong>ada<br />

El algoritmo de búsqueda secu<strong>en</strong>cial puede ser optimizado si el vector v está<br />

ord<strong>en</strong>ado (supongamos que de forma creci<strong>en</strong>te). En este caso, la búsqueda secu<strong>en</strong>cial<br />

desarrollada anteriorm<strong>en</strong>te es inefici<strong>en</strong>te, ya que, si el elem<strong>en</strong>to buscado<br />

elem no se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> el vector, se t<strong>en</strong>drá que recorrer todo el vector, cuando<br />

se sabe que si se llega a una compon<strong>en</strong>te con valor mayor que elem, ya no se<br />

<strong>en</strong>contrará el valor buscado.<br />

Una primera solución a este nuevo problema sería modificar la condición de<br />

salida del bucle repeat cambiando v[i]=elem por v[i]>=elem, debido a que el<br />

vector se <strong>en</strong>cu<strong>en</strong>tra ord<strong>en</strong>ado de forma creci<strong>en</strong>te:<br />

function BusquedaSecOrd(v: tVector; elem: tElem): tIntervalo;<br />

{PreC.: v está ord<strong>en</strong>ado creci<strong>en</strong>tem<strong>en</strong>te}<br />

{Dev. 0 (si elem no está <strong>en</strong> v) ó i (si v[i] = elem)}<br />

var<br />

i: tIntervalo;<br />

begin<br />

i:= 0;<br />

repeat<br />

{Inv.: ∀ j, 0 ≤ j ≤ i, ⇒ v[j] = elem}<br />

i:= i + 1<br />

until (v[i]>=elem) or (i=N);<br />

{v[i]=elem<br />

if v[i] = elem th<strong>en</strong> {se ha <strong>en</strong>contrado el elem<strong>en</strong>to elem}<br />

BusquedaSecOrd:= i<br />

else<br />

BusquedaSecOrd:= 0<br />

<strong>en</strong>d; {BusquedaSecOrd}<br />

Esta solución también se puede aplicar a archivos secu<strong>en</strong>ciales ord<strong>en</strong>ados<br />

(véase el apartado 15.3).<br />

15.1.3 Búsqueda binaria<br />

El hecho de que el vector esté ord<strong>en</strong>ado se puede aprovechar para conseguir<br />

una mayor efici<strong>en</strong>cia <strong>en</strong> la búsqueda planteando el sigui<strong>en</strong>te algoritmo: comparar<br />

elem con el elem<strong>en</strong>to c<strong>en</strong>tral; si elem es ese elem<strong>en</strong>to ya hemos terminado, <strong>en</strong><br />

otro caso buscamos <strong>en</strong> la mitad del vector que nos interese (según seaelem m<strong>en</strong>or<br />

o mayor que el elem<strong>en</strong>to mitad, buscaremos <strong>en</strong> la primera o segunda mitad del<br />

vector, respectivam<strong>en</strong>te). Posteriorm<strong>en</strong>te, si no se ha <strong>en</strong>contrado el elem<strong>en</strong>to<br />

repetiremos este proceso comparando elem con el elem<strong>en</strong>to c<strong>en</strong>tral del subvector<br />

seleccionado, y así sucesivam<strong>en</strong>te hasta que o bi<strong>en</strong> <strong>en</strong>contremos el valor elem o<br />

bi<strong>en</strong> podamos concluir que elem no está (porque el subvector de búsqueda está

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

Saved successfully!

Ooh no, something went wrong!