Sie sind auf Seite 1von 92

MetodologadelaProgramacin

d l d l

Tema V. Diseo de algoritmos iterativos


TemaV.Diseodealgoritmositerativos
Diseo de algoritmos iterativos correctos
Diseodealgoritmositerativoscorrectos

MP TemaV Diseodealgoritmositerativoscorrectos

1. Derivacin
1
Derivacindealgoritmos
de algoritmos
2. Diseodealgoritmoscorrectosconbucles
3. Diseodebuclesmediantedebilitamiento
de su postcondicin
desupostcondicin
4. Diseodealgoritmositerativosms
complejos
5. Aplicacinaldiseodealgoritmositerativos
Aplicacin al diseo de algoritmos iterativos
debsquedaenunatabla
6 Aplicacinaldiseodealgoritmosde
6.
li i l di d l i
d
ordenacininternadeunatabla
MP TemaV Diseodealgoritmositerativoscorrectos

1 Derivacindealgoritmos
1.
Derivacin de algoritmos
Disear el siguiente algoritmo
Disearelsiguientealgoritmo
{x=A y=B}
???
{x=B y=A}

MP TemaV Diseodealgoritmositerativoscorrectos

Hagamos un intento de diseo.


diseo Para empezar vamos a
modificar el valor de una de las variable. Por ejemplo
de la variable <x>:
{x=A y=B}
x:=x+y;
{x=A+B y=B}
???
{x=B y=A}

MP TemaV Diseodealgoritmositerativoscorrectos

Hagamosqueelvalordelavariable<y>
Hagamos
que el valor de la variable <y> seaelque
sea el que
debefinalmentetenerfinalmente,esdecir,<A>:
{x=A y=B}
x:=x+y;
{x=A+B y=B}
y:=x y;
{x=A+B y=A}
???
{x=B y=A}

MP TemaV Diseodealgoritmositerativoscorrectos

Slofaltamodificarelvalordelavariable<x>
Slo
falta modificar el valor de la variable <x> paraque
para que
valga<B>,sinalterarelvalorde<y>:
{x=A y=B}
x:=x+y;
{x=A+B y=B}
y:=x y;
{x=A+B y=A}
x:=x y;
{x=B y=A}
???
{x=B y=A}

Escorrectoeldiseorealizado?
MP TemaV Diseodealgoritmositerativoscorrectos

Eldiseoestconcluidoyescorrecto(regladel
El diseo est concluido y es correcto (regla del
debilitamientodelapostcondicin)!
{x=A y=B}
x:=x+y;
{x=A+B y=B}
y:=x y;
{x=A+B y
{
y=A}
}
x:=x y;
{x=B y=A}

{x=B y=A}

MP TemaV Diseodealgoritmositerativoscorrectos

Heaquelalgoritmodeducidoporderivacin
He
aqu el algoritmo deducido por derivacin del
del
cdigoapartirdesuespecificacin:
{x=A y=B}
x:=x+y;
y:=x y;
x:=x y;
{x=B y=A}

MP TemaV Diseodealgoritmositerativoscorrectos

Hagamosunsegundodiseo,modificandoenprimer
Hagamos
un segundo diseo modificando en primer
lugarelvalordelavariable<y>:
{x=A y=B}
y:=x
y:
x y;
{x=A y=AB}
???
{
{x=B
y=A}
}

MP TemaV Diseodealgoritmositerativoscorrectos

Hagamosqueelvalordelavariable<x>
Hagamos
que el valor de la variable <x> seaiguala
sea igual a
<B>,sinmodificarelvalordelavariable<y>:
{x=A y=B}
y:=x
y:
x y;
{x=A y=AB}
x:=x y;
{
{x=B
y=AB}
}
???
{x=B y
{
y=A}
}

MP TemaV Diseodealgoritmositerativoscorrectos

10

Slofaltamodificarelvalordelavariable<y>
Slo
falta modificar el valor de la variable <y> paraque
para que
valga<A>,sinalterarelvalorde<x>:
{x=A y=B}
y:=x
y:
x y;
{x=A y=AB}
x:=x y;
{
{x=B
y=AB}
}
y:=x+y;
{x=B y
{
y=A}
}

Hemossabidoderivar
Hemos
sabido derivar unsegundodiseodel
un segundo diseo del
algoritmo!
MP TemaV Diseodealgoritmositerativoscorrectos

11

2 Diseodealgoritmoscorrectosconbucles
2.
Diseo de algoritmos correctos con bucles
Disear el siguiente algoritmo con un bucle:
Disearelsiguientealgoritmoconunbucle:
{P}
???
{Q}

MP TemaV Diseodealgoritmositerativoscorrectos

12

Escribimos el bucle y ponemos interrogantes donde


haya que incluir cdigo para completar el diseo:
{P}
???
mientrasQue ???hacer
???
finMQ
???
{Q}

Lo primero que debemos hacer es dar con un mtodo


iterativo que resuelva el problema y resumirlo en un
predicado invariante. Otra alternativa es escribir
primero el invariante y deducir de l un mtodo
iterativo.
MP TemaV Diseodealgoritmositerativoscorrectos

13

Anotamos en el bucle el predicado invariante <I>:


Anotamosenelbucleelpredicadoinvariante
{P}
???
mientrasQue ???hacer {I}(1)
???
finMQ
???
{Q}

Paso 1.
1 El predicado invariante <I> puede deducirse en
muchos casos aplicando tcnicas de debilitamiento de
la postcondicin <Q>.
<Q>

MP TemaV Diseodealgoritmositerativoscorrectos

14

Paso 2 Diseamos el cdigo previo al bucle:


Paso2.Diseamoselcdigoprevioalbucle:
{P}
Accin_previa
disearestecdigo(2)
( )
{I}
mientrasQue
Q
???hacer {
{I}
}
(1)
(
)
???
finMQ
???
{Q}

MP TemaV Diseodealgoritmositerativoscorrectos

15

Pasos 3 y 4.
4 Deducimos la condicin <C> del bucle y el
cdigo posterior al bucle:
{P}
Accin_previa
(2)
{I}
mientrasQue C hacer {I}
(1),(3)
???
finMQ
{C I}
Accin_p
posterior
disearestecdigo(4)
g
( )
{Q}

MP TemaV Diseodealgoritmositerativoscorrectos

16

Pasos 5 y 6.
6 Diseamos el cdigo interior del bucle,
bucle
garantizando su terminacin mediante una funcin de
cota:
{P}
Accin_previa
( )
(2)
{I}
mientrasQue
Q
Chacer {I}
{
} {
{f_cota
_
}(1),(3),(6)
}
( ),( ),( )
{ I C}
Accin_a_iterar
disearestecdigo(5)
{ I}
finMQ
{ I C}
Accin_posterior
(4)
{Q}

MP TemaV Diseodealgoritmositerativoscorrectos

17

3 Diseo
3.
Diseodebuclesmediantedebilitamiento
de bucles mediante debilitamiento
desupostcondicin
Derivar un diseo iterativo del siguiente algoritmo:
{cierto}
???
{sumar(T)=([1,N].T[])}

MP TemaV Diseodealgoritmositerativoscorrectos

18

El esquema algortmico iterativo a disear es el


siguiente:
{cierto}
???
mientrasQue ???hacer
{I?}
???
finMQ
???
{
{sumar(T)=([1,N].T[])}
( )
( [ , ] []) }

MP TemaV Diseodealgoritmositerativoscorrectos

19

Paso 1.
1 Debilitamos la postcondicin sustituyendo la constante
<N> por una variable, por ejemplo, <hasta>, y el resultado de la
funcin <sumar(T)>
( ) por una variable, por ejemplo <suma>:
{cierto}
{
}
???
mientrasQue ???hacer {I:suma =([1,hasta].T[])}
???
finMQ
???
{sumar(T) =([1,N].T[])}

MP TemaV Diseodealgoritmositerativoscorrectos

20

Paso 2.
2 Procedemos a disear las acciones previas al bucle:
{cierto}
hasta:=1;suma:=T[1];
{suma=([1,hasta].T[])}
mientrasQue ???hacer {I:suma=([1,hasta].T[])}
???
finMQ
???
{sumar(T)=([1,N].T[])}

MP TemaV Diseodealgoritmositerativoscorrectos

21

Pasos 3 y 4.
4 Deducimos ahora la condicin del bucle y el cdigo
posterior al bucle:

{cierto}
hasta:=1;suma:=T[1];
{suma=([1,hasta].T[])}
mientrasQue not (hasta=N)hacer
{I:suma=([1,hasta].T[])}
???
finMQ
Q
{suma=([1,hasta].T[]) hasta=N }
devuelvesuma;
{
{sumar(T)=([1,N].T[])}
(T) ( [1 N] T[ ])}

MP TemaV Diseodealgoritmositerativoscorrectos

22

Pasos 5 y 6.
6 Deducimos el cdigo interior al bucle e identificamos
una funcin de cota que asegure su terminacin:

{cierto}
hasta:=1;suma:=T[1];
{suma=([1,hasta].T[])}
mientrasQue not (hasta=N)hacer {f_cota =N hasta}
{suma=([1,hasta].T[]) hastaN }
hasta:=hasta+1;suma:=suma+T[hasta];
{
{suma=([1,hasta].T[])}
(
[ ,
] [ ]) }
finMQ
{suma=([1,hasta].T[]) hasta=N }
de el e suma;
devuelve

{sumar(T)=([1,N].T[])}

MP TemaV Diseodealgoritmositerativoscorrectos

23

El algoritmo iterativo diseado es el siguiente:


{cierto}
hasta:=1;suma:=T[1];
mientrasQue not (hasta=N)hacer
{suma ([1,hasta].T[])}
{suma=([1,hasta].T[])}
hasta:=hasta+1;suma:=suma+T[hasta];
finMQ
d
devuelve
l
suma;
{sumar(T)=([1,N].T[])}

Conviene anotar los bucles con el predicado invariante que nos


h abierto
ha
b
l puertas de
las
d su diseo
d
ya que constituye un
excelente elemento de documentacin del cdigo.
MP TemaV Diseodealgoritmositerativoscorrectos

24

Nuevo problema de diseo iterativo.


iterativo Derivar un diseo
iterativo del siguiente algoritmo que trabaja con un
fichero <f> de datos numricos:
{cierto}
???
{
{suma=([1,numDatos(f)].dato(f,))}
(
[ ,
( )]
( , )) }

MP TemaV Diseodealgoritmositerativoscorrectos

25

El esquema algortmico a disear es el siguiente:


Elesquemaalgortmicoadiseareselsiguiente:
{cierto}
???
mientrasQue
Q
???hacer
{I?}
{

}
???
finMQ
???
{suma=([1,numDatos(f)].dato(f,))}

MP TemaV Diseodealgoritmositerativoscorrectos

26

Paso 1.
1 Debilitamos la postcondicin sustituyendo el valor
constante
<numDatos(f)>
por
el
valor
variable
<numLedos(f)>:
( )
{cierto}
{
}
???
mientrasQue ???hacer
{I:modo(f) Lec
{I:modo(f)=Lec
suma=([1,numLedos(f)].dato(f,))}
???
finMQ
???
{suma=([1 numDatos(f)] dato(f ))}
{suma=([1,numDatos(f)].dato(f,))}

MP TemaV Diseodealgoritmositerativoscorrectos

27

Paso 2.
2 Procedemos a disear las acciones previas al bucle:
{cierto}
iniciarLectura(f);suma:=0.0;
{modo(f)=Lec suma=([1,numLedos(f)].dato(f,))}
mientrasQue ???hacer
{I:modo(f)=Lec
suma=([1,numLedos(f)].dato(f,))}
suma=([1 numLedos(f)] dato(f ))}
???
finMQ
???
{suma=([1,numDatos(f)].dato(f,))}

MP TemaV Diseodealgoritmositerativoscorrectos

28

Pasos 3 y 4.
4 Deducimos ahora la condicin del bucle y el cdigo
posterior al bucle:
{cierto}
iniciarLectura(f);suma:=0.0;
{suma=([1 numLedos(f)] dato(f ))}
{suma=([1,numLedos(f)].dato(f,))}
mientrasQue not finFichero(f) hacer
{I:modo(f)=Lec
suma=([1,numLedos(f)].dato(f,))}
???
finMQ
Q
{modo(f)=Lec suma=([1,numLedos(f)].dato(f,))
finFichero(f)
finFichero(f)=(numLedos(f)=numDatos(f)) }
nula;{vamosaeliminarlaporserinnecesaria}
{suma=([1,numDatos(f)].dato(f,))}
MP TemaV Diseodealgoritmositerativoscorrectos

29

Pasos 5 y 6.
6 Deducimos el cdigo interior al bucle e identificamos
una funcin de cota que asegure su terminacin:

{cierto}
iniciarLectura(f);suma:=0 0;
iniciarLectura(f);suma:=0.0;
{suma=([1,numLedos(f)].dato(f,))}
mientrasQue not finFichero(f)hacer
{f_cota =numDatos(f) numLedos(f)}
{modo(f)=Lec suma=([1,numLedos(f)].dato(f,))
finFichero(f)
( )
finFichero(f)=(numLedos(f)numDatos(f))}
leer(f,nuevo);suma:=suma+nuevo;
{modo(f)=Lec suma=([1,numLedos(f)].dato(f,))}
suma=([1 numLedos(f)] dato(f ))}
finMQ
{suma=([1,numDatos(f)].dato(f,))}
MP TemaV Diseodealgoritmositerativoscorrectos

30

El algoritmo iterativo diseado es el siguiente:


{cierto}
iniciarLectura(f);suma:=0.0;
mientrasQue not finFichero(f)hacer
{modo(f)=Lec
{modo(f)
Lec suma
suma=([1,numLedos(f)].dato(f,))}
([1,numLedos(f)].dato(f,))}
leer(f,nuevo);suma:=suma+nuevo;
finMQ
{
{suma=([1,numDatos(f)].dato(f,))}
( [
t (f)] d t (f )) }

Recordamos que conviene anotar los bucles con el predicado


invariante que nos ha abierto las puertas de su diseo ya que
constituye un excelente elemento de documentacin del cdigo.

MP TemaV Diseodealgoritmositerativoscorrectos

31

4 Diseo
4.
Diseodealgoritmositerativosms
de algoritmos iterativos ms
complejos
Disearelsiguientealgoritmosinutilizarlaoperacin
de potenciacin
depotenciacin.
{n0}
???
{elevar(x,n)=xn }

MP TemaV Diseodealgoritmositerativoscorrectos

32

Aplicaremosunmtodoclculobasadoenlassiguiente
Aplicaremos
un mtodo clculo basado en las siguiente
propiedades.
Mtododeclculodexn decostelogartmicoen<n>:
n
n=0
0 xn =1.0
1 0
n>0 nmod 2=0 xn =[xn/2]2
n>0
n>0 nmod 2 0 xn =x.[x
x [xn/2]2

MP TemaV Diseodealgoritmositerativoscorrectos

33

El esquema algortmico a disear es el siguiente:


Elesquemaalgortmicoadiseareselsiguiente:
{n0}
???
mientrasQue
Q
???hacer
???
finMQ
???
{elevar(x,n)=xn }

{I?}
{

MP TemaV Diseodealgoritmositerativoscorrectos

34

Un invariante del bucle que permita resolver el problema no es inmediato.


Para construirlo introducimos las variables nVar (valor variable del
exponente), resultado (almacena el resultado parcial y final), e (exponente
potencia de 2) y potencias (potencias de 2) :
{Invariante:xn =resultado.[xnVar]e

potencias=xe }

nVar

resultado

invariante

potencias

2
27

1.0
0

x27=1.0
0 [
[x27]1

x1

13

x27=x [x13]2

x2

x3

x27=x
x3 [x6]4

x4

x3

x27=x3 [x3]8

x8

x11

x27=x
x11 [x1]16

x16

16

x27

x27=x27 [x0]32

x32

32

Clculosrealizados:x27

=1.x1.x2.x8.x16

MP TemaV Diseodealgoritmositerativoscorrectos

35

Paso 1.
1 Esquema iterativo del algoritmo a derivar.
derivar El
invariante del bucle se deduce a partir del mtodo de
clculo a aplicar:
{n0}
???
mientrasQue
Q
???hacer
{Inv:xn =resultado.[xnVar]e potencias= xe }
???
finMQ
???
{elevar(x,n)=xn }

MP TemaV Diseodealgoritmositerativoscorrectos

36

Paso 2 Diseamos el cdigo previo al bucle:


Paso2.Diseamoselcdigoprevioalbucle:
{n0}
nVar :=n;resultado:=1.0;e:=1;potencias:=x;
{xn =resultado.[x
{
[ nVar]e p
potencias= xe }
mientrasQue ???hacer
{Inv:xn =resultado.[xnVar]e potencias= xe }
???
finMQ
???
{elevar(x,n)=xn }

MP TemaV Diseodealgoritmositerativoscorrectos

37

Pasos 3 y 4.
4 Deducimos la condicin del bucle y el
cdigo posterior a l:
{n0}
nVar :=n;resultado:=1.0;e:=1;potencias:=x;
p
{xn =resultado.[xnVar]e potencias= xe }
mientrasQue not (nVar=0)hacer
{Inv:xn =resultado.[x
=resultado [xnVar]e potencias= xe }
???
finMQ
{xn =resultado.[xnVar]e potencias= xe nVar=0}
devuelve resultado;
{elevar(x,n)=x
{elevar(x,n)
xn }
nVar=0 xn =resultado.[xnVar]e =resultado.[x0]e
=resultado.[1]
lt d [ ]e =resultado
lt d
MP TemaV Diseodealgoritmositerativoscorrectos

38

Pasos 5 y 6.
6 Diseamos el cdigo interior del bucle y
proponemos una funcin de cota que permite probar su
terminacin:
{n0}
nVar :=n;resultado:=1.0;e:=1;potencias:=x;
: n;resultado: 1 0;e: 1;potencias: x;
mientrasQue not (nVar=0)hacer {f_cota :nVar }
{xn =resultado.[xnVar]e potencias= xe nVar0 }
si not (nVar mod 2=0)entonces
resultado:=potencias*resultado;
finSi
nVar :=nVar/2;e:=2*e;potencias:=potencias*potencias;
{xn =resultado.[xnVar]e potencias= xe }
finMQ
fi
devuelve resultado;
{elevar(x,n)=xn }
MP TemaV Diseodealgoritmositerativoscorrectos

39

El resultado del diseo iterativo es el siguiente:


Elresultadodeldiseoiterativoeselsiguiente:
{n0}
nVar :=n;resultado:=1.0;e:=1;potencias:=x;
mientrasQue not (nVar=0)hacer
{xn =resultado.[x
resultado.[xnVar]e potencias
potencias= xe }
si not (nVar mod 2=0)entonces
resultado:=potencias*resultado;
fi Si
finSi
nVar :=nVar/2;e:=2*e;potencias:=potencias*potencias;
finMQ
devuelve resultado;
{elevar(x,n)=xn }

Sehaanotadoelbucleconelpredicadoinvariante queresumeel
mtodo de clculo aplicado
mtododeclculoaplicado.
MP TemaV Diseodealgoritmositerativoscorrectos

40

5 Aplicacin
5.
Aplicacinaldiseodealgoritmositerativos
al diseo de algoritmos iterativos
debsquedaenunatabla
ElementosdefinidosenunprogramaescritoenAda.

DefinicindeltipotpTabla quealmacena<N>datosde
tipotpD

N:constant integer :=...; Nm.datosdelastablas


subtype tpIndice is integer range 1..N;
type tpTabla is array (tpIndice)of tpD;

MP TemaV Diseodealgoritmositerativoscorrectos

41

Problema 5.1.
5 1 Derivar un diseo iterativo para el
siguiente algoritmo Ada.

function buscar(T:in tpTabla;dato:intpD)


return tpIndice is

Pre:([1,N].T()=dato)
(
[
] ( )
)
Post:T(buscar(T,dato))=dato

MP TemaV Diseodealgoritmositerativoscorrectos

42

Esquema del algoritmo iterativo a disear


Esquemadelalgoritmoiterativoadisear.

f
function
ti
b
buscar(T:in
(T i tpTabla;dato:out
t T bl d t t tpD)
t D)
return tpIndice is

Pre:([1,N].T()=dato)
Post:T(buscar(T,dato))=dato

begin
???
while ???loop
Invariante
???
end loop;
p;
???
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

43

Paso 1.
1 Proponemos un predicado invariante para el bucle

hasta:tpIndice;

begin
([1,N].T()=dato)
???
while
hil ???loop
??? l
Inv:([1,hasta1].T()dato)
( [ h t
] ( ) d t )
???
end loop;
???
T(buscar(T,dato))=dato
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

44

Paso 2 Diseamos el cdigo previo al bucle


Paso2.Diseamoselcdigoprevioalbucle

hasta:tpIndice;

begin
([1,N].T()=dato)
hasta:=1;
([1,hasta1].T()dato)
( [ h t
] ( ) d t )
while ???loop
Inv:([1,hasta1].T()dato)
???
end loop;
???
T(buscar(T,dato))=dato
T(buscar(T dato))=dato
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

45

Pasos 3 y 4 Condicin del bucle y el cdigo posterior


Pasos3y4.Condicindelbucleyelcdigoposterior

hasta:tpIndice;

begin
([1,N].T()=dato)
hasta:=1;
while
hil not
t (T(hasta)=dato)
( (h t ) d t ) loop
l
Inv:([1,hasta1].T()dato)
???
end loop;
([1,hasta1].T()dato) T(hasta)=dato
devuelvehasta;
T(buscar(T,dato))=dato
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

46

Pasos 5 y 6 Cdigo interior del bucle y funcin de cota


Pasos5y6.Cdigointeriordelbucleyfuncindecota

h t t I di
hasta:tpIndice;

begin
([1,N].T()=dato)
hasta:=1;
while not (T(hasta)=dato)loop
f_cota
f cota =N
=N hasta
Inv:([1,hasta1].T()dato)
([1,hasta1].T()dato) T(hasta)dato
hasta:=hasta+1;
([1,hasta1].T()dato)
end loop;
devuelve hasta;
T(buscar(T,dato))=dato
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

47


function buscar(T:in tpTabla;dato:out tpD)
return tpIndice is

Pre:([1,N].T()=dato)
Post:T(buscar(T,dato))=dato

hasta:tpIndice;

begin
hasta:=1;
while not (T(hasta)=dato)loop
([1,hasta1].T()dato)
([1 hasta1] T()dato)
hasta:=hasta+1;
end loop;
devuelve hasta;
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

48

Problema 5.2.
5 2 Derivar un diseo iterativo para el
siguiente algoritmo Ada.

function buscar(T:in tpTabla;dato:intpD)


return integer is

Pre:cierto
i
Post:(([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()=dato)
[
] ( )
)
T(buscar(T,dato))=dato)
(
(
))
)

((

MP TemaV Diseodealgoritmositerativoscorrectos

49

Esquema del algoritmo iterativo a disear


Esquemadelalgoritmoiterativoadisear.

function buscar(T:in tpTabla;dato:intpD)


return integer is

Pre:cierto
Post:(([1,N].T()dato) buscar(T,dato)=0)

(([1,N].T()=dato) T(buscar(T,dato))=dato)

begin
???
while ???loop
Invariante
???
end loop;
???
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

50


hasta:tpIndice;esta:boolean;

b i
begin
cierto
???
while ???loop
Inv:esta=([1,hasta].T()=dato)

esta T(hasta)=dato
???
end loop;
???
([1,N].T()dato) buscar(T,dato)=0)
((
(([1,N].T()=dato)
[ , ] ( )
)
T(buscar(T,dato))=dato)
(
( ,
))
)
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

51


hasta:tpIndice;esta:boolean;

b i
begin
cierto
hasta:=1;esta:=T(hasta)=dato;
esta=([1,hasta].T()=dato) esta T(hasta)=dato
while ???loop
Inv:esta=([1,hasta].T()=dato)
Inv:esta=([1 hasta] T()=dato)

esta T(hasta)=dato
???
end loop;
???
(
([1,N].T()dato)
[ , ] ( )
)
buscar(T,dato)=0)
( ,
) )
(([1,N].T()=dato) T(buscar(T,dato))=dato)
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

52


hasta:tpIndice;esta:boolean;

begin
g
cierto
hasta:=1;esta:=T(hasta)=dato;
esta
esta=([1,hasta].T()=dato)
([1,hasta].T() dato) esta T(hasta)
T(hasta)=dato
dato
while not (hasta=Nor esta)loop
Inv:esta=([1,hasta].T()=dato) esta T(hasta)=dato
???
end loop;
esta=([1,hasta].T()=dato) esta T(hasta)=dato
(hasta=N esta)
if estathen return hasta;else return 0;end if;
([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()=dato)
(([1 N] T()=dato) T(buscar(T,dato))=dato)
T(buscar(T dato))=dato)
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

53


hasta:tpIndice;esta:boolean;

begin
g
cierto
hasta:=1;esta:=T(hasta)=dato;
while not (hasta
(hasta=Nor
Nor esta)loop
f_cota
f cota =N
N hasta
Inv:esta=([1,hasta].T()=dato) esta T(hasta)=dato
esta=([1,hasta].T()=dato) esta T(hasta)=dato
(hastaN esta)
hasta:=hasta+1;esta:=T(hasta)=dato;
esta=([1,hasta].T()=dato) esta T(hasta)=dato
end loop;
if estathen return hasta;else return 0;end if;
([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()=dato)
(([1 N] T()=dato) T(buscar(T,dato))=dato)
T(buscar(T dato))=dato)
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

54


function buscar(T:in tpTabla;dato:intpD)
return integer is

Pre:cierto
Post:(([1,N].T()dato) buscar(T,dato)=0)

(([1,N].T()
(([1,N].T()=dato)
dato) T(buscar(T,dato))
T(buscar(T,dato))=dato)
dato)

hasta:tpIndice;esta:boolean;

begin
hasta:=1;esta:=T(hasta)=dato;
while not (hasta=Nor esta)loop
esta=([1,hasta].T()=dato) esta T(hasta)=dato
hasta:=hasta+1;esta:=T(hasta)=dato;
end loop;
if estathen return hasta;else return 0;end if;
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

55

Problema5.3.Derivarundiseoiterativodelsiguiente
Problema
5 3 Derivar un diseo iterativo del siguiente
algoritmoAda.

function buscar(T:in tpTabla;dato:intpD)


return integer is

Pre:([1,N1].T()T(+1))
(
[
] ( ) (
))
Post:(([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()=dato)
[
] ( )
)
T(buscar(T,dato))=dato)
(
(
))
)

((

Utilizaremos:
l
ordenada(T,inf,sup)=([inf,sup1].T()T(+1))
esta(T,dato,inf,sup)=([inf,sup].T()=dato)
t (T d t i f
) ( [i f
] T( ) d t )
MP TemaV Diseodealgoritmositerativoscorrectos

56


function buscar(T:in tpTabla;dato:intpD)
return
t
i t
integer
i
is

Pre:ordenada(T,1,N)
Post:(esta(T,dato,1,N) buscar(T,dato)=0)

(esta(T,dato,1,N) T(buscar(T,dato))=dato)

Hemos utilizado los siguientes predicados:


Hemosutilizadolossiguientespredicados:
ordenada(T,inf,sup)=([inf,sup1].T()T(+1))
esta(T,dato,inf,sup)=([inf,sup].T()=dato)

MP TemaV Diseodealgoritmositerativoscorrectos

57

Esquema del algoritmo iterativo a disear


Esquemadelalgoritmoiterativoadisear.

function buscar(T:in tpTabla;dato:intpD)


return integer is

Pre:([1,N 1].T()T(+1))
Pre:([1,N1].T()T(+1))
Post:(([1,N].T()dato) buscar(T,dato)=0)

(([1,N].T()=dato) T(buscar(T,dato))=dato)

begin
???
while ???loop
Invariante
???
end loop;
???
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

58


izda,dcha:tpIndice;

begin
g
ordenada(T,1,N)
???
while ???loop
Inv:ordenada(T,1,N) izdadcha

esta(T,dato,1,N)=esta(T,dato,izda,dcha)
???
end loop;
???
(esta(T,dato,1,N)
(esta(T dato 1 N) buscar(T,dato)=0)
buscar(T dato)=0)
(esta(T,dato,1,N) T(buscar(T,dato))=dato)
end buscar;

Donde:ordenada(T,inf,sup)=([inf,sup1].T()T(+1))
esta(T dato inf sup) ( [inf sup] T( ) dato)
esta(T,dato,inf,sup)=([inf,sup].T()=dato)
MP TemaV Diseodealgoritmositerativoscorrectos

59


izda,dcha:tpIndice;

begin
g
ordenada(T,1,N)
izda :=1;dcha :=N;
ordenada(T,1,N) izdadcha
esta(T,dato,1,N)=esta(T,dato,izda,dcha)
while ???loop
Inv:ordenada(T,1,N)
Inv:ordenada(T 1 N) izdadcha

esta(T,dato,1,N)=esta(T,dato,izda,dcha)
???
end loop;
???
(esta(T,dato,1,N) buscar(T,dato)=0)
(esta(T,dato,1,N)
(esta(T dato 1 N) T(buscar(T,dato))=dato)
T(buscar(T dato))=dato)
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

60


izda,dcha:tpIndice;

begin
g
ordenada(T,1,N)
izda :=1;dcha :=N;
while not (izda =dcha)
dcha) loop
Inv:ordenada(T,1,N) izdadcha

esta(T,dato,1,N)=esta(T,dato,izda,dcha)
???
end loop;
ordenada(T,1,N) esta(T,dato,1,N)=esta(T,dato,izda,dcha)
izda=dcha
if T(izda)=datothen return izda;else return 0;end if;
(esta(T,dato,1,N) buscar(T,dato)=0)
(esta(T,dato,1,N)
(esta(T dato 1 N) T(buscar(T,dato))=dato)
T(buscar(T dato))=dato)
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

61


izda,dcha,medio:tpIndice;

begin
ordenada(T,1,N)
( , , )
izda :=1;dcha :=N;
while not (izda =dcha)loop
f_cota =dcha izda
ordenada(T,1,N) esta(T,dato,1,N)
esta(T,dato,1,N)=esta(T,dato,izda,dcha)
esta(T,dato,izda,dcha)
izda<dcha
medio:=(izda +dcha)/2;
if T(medio)<dato
then izda :=medio+1;else dcha :=medio;
end if;
ordenada(T,1,N)
ordenada(T 1 N) izdadcha
esta(T,dato,1,N)=esta(T,dato,izda,dcha)
end loop;
if T(izda)=datothen return izda;else return 0;end if;
(esta(T,dato,1,N) buscar(T,dato)=0)
(esta(T,dato,1,N) T(buscar(T,dato))=dato)
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

62


function buscar(T:in tpTabla;dato:intpD)return integer is

Pre:([1,N1].T()T(+1))
Post:(([1,N].T()dato) buscar(T,dato)=0)

(([1,N].T()=dato) T(buscar(T,dato))=dato)

izda,dcha,medio:tpIndice;

begin
izda :=1;dcha :=N;
while not (izda =dcha)loop
ordenada(T,1,N) izdadcha
esta(T,dato,1,N)=esta(T,dato,izda,dcha)
medio:=(izda +dcha)/2;
if T(medio)<dato
then izda :=medio+1;else dcha :=medio;
end if;
end
d loop;
l
if T(izda)=datothen return izda;else return 0;end if;
end buscar;

MP TemaV Diseodealgoritmositerativoscorrectos

63

6 Aplicacin
6.
Aplicacinaldiseodealgoritmosde
al diseo de algoritmos de
ordenacininternadeunatabla
DisearelsiguientealgoritmoAda:

procedure ordenar(T:inout tpTabla)is

Pre:T=To
Post:([1,N1].T()T(+1))

([1,N].(Nm [1,N].To()=To())

=(Nm [1,N].T()=To()))

Utilizaremos:
Utilizaremos:
ordenada(T,inf,sup)=([inf,sup1].T()T(+1))
sonPermutacion(T1,T2,inf,sup)=
([inf,sup].(Nm [inf,sup].T1()=T1())
=(Nm [inf,sup].T2()=T1()))

64

Disear el siguiente algoritmo Ada:


DisearelsiguientealgoritmoAda:

procedure ordenar(T:inout tpTabla)is

Pre:T=To
Post:sonPermutacion(To,T,1,N)
P t
P
t i (T T 1 N) ordenada(T,1,N)
d
d (T 1 N)

Hemosutilizadolossiguientespredicados:
ordenada(T,inf,sup)=([inf,sup1].T()T(+1))
sonPermutacion(T1 T2 inf sup)=
sonPermutacion(T1,T2,inf,sup)=
([inf,sup].(Nm [inf,sup].T1()=T1())
=(Nm [inf,sup].T2()=T1()))

MP TemaV Diseodealgoritmositerativoscorrectos

65

Esquema del algoritmo iterativo a disear


Esquemadelalgoritmoiterativoadisear.

procedure ordenar(T:inout tpTabla)is

Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)

begin
???
while ???loop
Invariante
???
end loop;
???
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

66

Problema6.1.Diseodelalgoritmodeordenacininternapor
Problema
6 1 Diseo del algoritmo de ordenacin interna por
seleccindirecta

procedure ordenar(T:inout tpTabla)is

Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)

begin
???
while ???loop
Inv:????
I
????
???
end loop;
???
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

67


procedure ordenar(T:inout tpTabla)is

Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)

i:integer;

begin
???
while ???loop
Inv:([1,i].([i+1,N].T()T()))

ordenada(T,1,i+1)
ordenada(T 1 i+1) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N)
???
end loop;
???
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

68


i:integer;

begin
g
T=To
i:=0;
([1,i].([i+1,N].T()T()))
ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
while ???loop
Inv:([1,i].([i+1,N].T()T()))
Inv:([1 i] ([i+1 N] T()T()))

ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
???
end loop;
???
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

69


i:integer;

begin
g
T=To
i:=0;
([1,i].([i+1,N].T()T()))
ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
while not (i=N1)loop
Inv:([1,i].([i+1,N].T()T()))
Inv:([1 i] ([i+1 N] T()T()))

ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
???
end loop;
([1,i].([i+1,N].T()T()))
ordenada(T,1,i+1) sonPermutacion(To,T,1,N) i=N1
nula;
nula;
laeliminamosporserinnecesaria
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

70


i:integer;j,iMenor :tpIndice;

begin
T=To
T T
i:=0;
while not (i=N1)loop
Inv:([1,i].([i+1,N].T()T()))

ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
???
while ???loop
InvInt:([1,i1].([i,N].T()T())) ([i,j].T(iMenor)T())

ordenada(T,1,i) sonPermutacion(To,T,1,N)
???
end
d loop;
l
???
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

71


i:integer;j,iMenor :tpIndice;

begin
T=To
T T
i:=0;
while not (i=N1)loop
Inv:([1,i].([i+1,N].T()T()))

ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
i:=i+1;iMenor:=i;j:=i;
([1,i1].([i,N].T()T())) ([i,j].T(iMenor)T())
ordenada(T,1,i) sonPermutacion(To,T,1,N)
while ???loop
InvInt:([1,i1].([i,N].T()T())) ([i,j].T(iMenor)T())

ordenada(T,1,i)
d
d (T 1 i) sonPermutacion(To,T,1,N)
P
t i (T T 1 N)
???
end loop;
???
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

72


i:integer;j,iMenor
g
j
:tpIndice;dato:tpD;
p
p

begin
T=To
i:=0;
while not (i=N1)loop
Inv:([1,i].([i+1,N].T()T()))

ordenada(T,1,i+1)
ordenada(T 1 i+1) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N)
i:=i+1;iMenor:=i;j:=i;
while not (j=N) loop
InvInt:([1,i1].([i,N].T()T())) ([i,j].T(iMenor)T())

iMenori ordenada(T,1,i) sonPermutacion(To,T,1,N)


???
end loop;
([1,i1].([i,N].T()T()))
(
(
( ) ( )))
(
([i,j].T(iMenor)T())
(
) ( ))
iMenori ordenada(T,1,i) sonPermutacion(To,T,1,N) j=N
dato:=T(i);T(i):=T(iMenor);T(iMenor):=dato;
([1,i].([i+1,N].T()T()))
([1 i] ([i+1 N] T()T()))
ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;

73


i:integer;j,iMenor
g
j
:tpIndice;dato:tpD;
p
p

begin
T=To
i:=0;
while not (i=N1)loop
f_cota =N i
Inv:([1,i].([i+1,N].T()T()))

ordenada(T,1,i+1)
ordenada(T 1 i+1) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N)
i:=i+1;iMenor:=i;j:=i;
while not (j=N)loop
f_cota =N j
([1,i1].([i,N].T()T())) ([i,j].T(iMenor)T())
iMenori ordenada(T,1,i) sonPermutacion(To,T,1,N) j N
j:=j+1;
if T(j)<T(iMenor)then iMenor :=j;end if;
([1,i1].([i,N].T()T()))
(
(
( ) ( )))
(
([i,j].T(iMenor)T())
(
) ( ))
iMenori ordenada(T,1,i) sonPermutacion(To,T,1,N)
end loop;
dato:=T(i);T(i):=T(iMenor);T(iMenor):=dato;
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;

74

Problema6.2.Diseodelalgoritmodeordenacininternapor
Problema
6 2 Diseo del algoritmo de ordenacin interna por
intercambiodirecto

procedure ordenar(T:inout tpTabla)is

Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)

begin
???
while ???loop
Inv:???
I
???
???
end loop;
???
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

75


procedure ordenar(T:inout tpTabla)is

Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)

i:tpIndice;

begin
???
while ???loop
Inv:([1,Ni].([Ni+1,N].T()T()))

ordenada(T,Ni,N)
ordenada(T Ni N) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N)
???
end loop;
???
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

76


i:tpIndice;

begin
g
T=To
i:=0;
([1,Ni].([Ni+1,N].T()T()))
([1,N i].([N i+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
while ???loop
Inv:([1,N
Inv:([1 Ni]
i].([N
([Ni+1
i+1,N].T()T()))
N] T()T()))

ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
end loop;
???
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

77


i:tpIndice;

begin
g
T=To
i:=0;
while not (i
(i=N1)
N 1) loop
Inv:([1,Ni].([Ni+1,N].T()T()))

ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
end loop;
([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N)
ordenada(T Ni N) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N) i=N1
nula; laeliminamosporserinnecesaria
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

78


i,j :tpIndice;

begin
T=To
T T
i:=0;
while not (i=N1)loop
Inv:([1,Ni].([Ni+1,N].T()T()))
Inv:([1,N i].([N i+1,N].T()T()))

ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
while ???loop
Inv2:([1,Ni+1].([Ni+2,N].T()T()))

T(j+1)=(Mx [1,j+1].T())

ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
end loop;
???
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

79


i j t I di
i,j:tpIndice;

begin
T=To
T To
i:=0;
while not (i=N1)loop
([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N) i N1
i:=i+1;j:=0;
([1,Ni+1].([Ni+2,N].T()T()))
T(j+1)=(Mx
T(j 1) (M [1,j+1].T())
[1 j 1] T( ))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
while ???loop
Inv2:([1,Ni+1].([Ni+2,N].T()T()))
Inv2:([1,N i+1].([N i+2,N].T()T()))

T(j+1)=(Mx [1,j+1].T())

ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
end loop;
???
end loop;
ordenada(T,1,N)
d
d (T 1 N) sonPermutacion(To,T,1,N)
P
t i (T T 1 N)
end ordenar;

80

begin
T=To
T T
i:=0;
while not (i=N1)loop
Inv:([1,Ni].([Ni+1,N].T()T()))
Inv:([1,N i].([N i+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
i:=i+1;j:=0;
while not (j=N i) loop
Inv2:([1,Ni+1].([Ni+2,N].T()T()))

T(j+1)=(Mx [1,j+1].T())

ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
end loop;
([1,Ni+1].([Ni+2,N].T()T()))
T(j+1)
T(j+1)=(Mx
(Mx [1,j+1].T())
ordenada(T,Ni,N) sonPermutacion(To,T,1,N) j=Ni
nula; laeliminamosporserinnecesaria
([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;
d
81


i,j:tpIndice;d:tpD;
j
p
p ;

begin
T=To
i:=0;
while not (i=N1)loop
f_cota =N i
Inv:([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N)
ordenada(T Ni N) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N)
i:=i+1;j:=0;
while not (j=N i)loop
f_cota =N j
([1,Ni+1].([Ni+2,N].T()T()))
T(j+1)=(Mx [1,j+1].T())
ordenada(T,Ni,N) sonPermutacion(To,T,1,N) i Ni
j:=j+1;
i T(j)>T(j+1)then
if
(j) (j )
d:=T(j);T(j):=T(j+1);T(j+1):=d;end
(j)
(j)
(j )
(j )
i
if;
([1,Ni+1].([Ni+2,N].T()T()))
T(j+1)=(Mx [1,j+1].T())
ordenada(T Ni
i,N)
N) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N) i N
Ni
i
ordenada(T,N
end loop;
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;

82


procedure ordenar(T:inout
p
(
tpTabla)is
p
)

Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)

i,j:tpIndice;d:tpD;

begin
i:=0;
while not (i=N1)loop
([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
i:=i+1;j:=0;
while not (j=N i)loop
([1,Ni+1].([Ni+2,N].T()T()))
(
(
( ) ( )))
T(j+1)=(Mx [1,j+1].T())
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
j:=j+1;
if T(j)>T(j+1)then d:=T(j);T(j):=T(j+1);T(j+1):=d;end if;
end loop;
end loop;
end ordenar;

83

Problema6.3.Diseodelalgoritmodeordenacininternaporel
Problema
6 3 Diseo del algoritmo de ordenacin interna por el
mtododeordenacinrpida(quicksort)deC.A.R.Hoare

procedure ordenar(T:inout tpTabla)is

Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)

begin
???
end ordenar;

Seplanteaundiseoporinmersin.

MP TemaV Diseodealgoritmositerativoscorrectos

84


procedure ordenar(T:inout tpTabla)is

Pre:T=To
Post:ordenada(T,1,N)
t
d
d ( 1 )
sonPermutacion(To,T,1,N)
t i (
1 )

procedure quicksort (T:inout tpTabla;izda,dcha:in tpIndice)is

Pre:T=To izdadcha
Post:ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)

begin
???
end
d quicksort;
i k
t

begin
quicksort(T,1,N);
end ordenar;

MP TemaV Diseodealgoritmositerativoscorrectos

85


procedure quicksort (T:inout tpTabla;izda,dcha:in tpIndice)is

Pre:T=To izdadcha
Post:ordenada(T,izda,dcha)
t
d
d ( i d d h )
sonPermutacion(To,T,izda,dcha)
t i (
i d d h )

begin
T
T=To
To izdadcha
if izda<dcha then
???
while ???loop
Inv:???
???
end loop;
???
end if;
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end quicksort;

MP TemaV Diseodealgoritmositerativoscorrectos

86


i,d:tpIndice;pivote:tpD;

begin
T=To izdadcha
if izda<dcha then
???
while ???loop
Inv:pivote=T(izda) izda+1 i d dcha i d+1

([izda+1,i1].T() pivote) ([d+1,dcha].pivote T())

sonPermutacion(To,T,izda,dcha)
( , ,
,
)
???
end loop;
???
end if;
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end quicksort;

MP TemaV Diseodealgoritmositerativoscorrectos

87


i,d:tpIndice;pivote:tpD;

begin
T=To izdadcha
i d d h
if izda<dcha then
T=To izda<dcha
pivote:=T(izda);i:=izda +1;d:=dcha;
pivote=T(izda) izda+1 i d dcha i d+1
([izda+1,i1].T() pivote) ([d+1,dcha].pivote T())
sonPermutacion(To,T,izda,dcha)
while ???loop
Inv:pivote=T(izda) izda+1 i d dcha i d+1

([izda+1,i1].T() pivote) ([d+1,dcha].pivote T())

sonPermutacion(To,T,izda,dcha)
P
t i (T T i d d h )
???
end loop;
???
end if;
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end quicksort;

MP TemaV Diseodealgoritmositerativoscorrectos

88


i,d:tpIndice;pivote:tpD;

begin
T=To izdadcha
i d d h
if izda<dcha then
pivote:=T(izda);i:=izda +1;d:=dcha;
while not (i=d+1)loop
Inv:pivote=T(izda) izda+1 i d dcha i d+1

([izda+1,i1].T() pivote) ([d+1,dcha].pivote T())

sonPermutacion(To,T,izda,dcha)
???
end loop;
pivote=T(izda) izda+1 i d dcha i d+1
([izda+1,i1].T()
( [i d 1 i 1] T( ) pivote)
i t ) ([d+1,dcha].pivote
( [d 1 d h ] i t T())
T( ))
sonPermutacion(To,T,izda,dcha) i=d+1
T(izda):=T(d);T(d):=pivote;
quicksort(T,izda,d 1);quicksort(T,d+1,dcha);
quicksort(T,izda,d1);quicksort(T,d+1,dcha);
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end if;
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end quicksort;

MP TemaV Diseodealgoritmositerativoscorrectos

89


begin
T=To izdadcha
if izda<dcha then
pivote:=T(izda);i:=izda
i t T(i d ) i i d +1;d:=dcha;
1 d d h
while not (i=d+1)loop
f_cota =d i+1
pivote=T(izda) izda+1 i d dcha i d+1
([izda+1,i
([izda+1,i1].T()
1].T() pivote) ([d+1,dcha].pivote T())
sonPermutacion(To,T,izda,dcha) i d+1
if T(i)pivote
then i:=i+1;
elsif T(d)pivotethen d:=d 1;
else dato:=T(i);T(i):=T(d);T(d):=dato;i:=i+1;d:=d 1;
end if;
pivote=T(izda)
i t T(i d ) izda+1
i d 1 i
i d dcha
d h i d+1
d 1
([izda+1,i1].T() pivote) ([d+1,dcha].pivote T())
sonPermutacion(To,T,izda,dcha)
end loop;
T(izda):=T(d);T(d):=pivote;
quicksort(T,izda,d1);quicksort(T,d+1,dcha);
end if;
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end quicksort;
90


procedure quicksort (T:inout tpTabla;izda,dcha:in tpIndice)is

Pre:T=To izdadcha
Post:ordenada(T izda dcha) sonPermutacion(To,T,izda,dcha)
sonPermutacion(To T izda dcha)
Post:ordenada(T,izda,dcha)

i,d:tpIndice;pivote,dato:tpD;

begin
if izda<dcha then
pivote:=T(izda);i:=izda +1;d:=dcha;
while not (i=d+1)loop
(
)
p
pivote=T(izda) izda+1 i d dcha i d+1
([izda+1,i1].T() pivote) ([d+1,dcha].pivote T())
sonPermutacion(To,T,izda,dcha)
if T(i)pivote
then
i:=i+1;
elsif T(d)pivotethen d:=d 1;
else dato:=T(i);T(i):=T(d);T(d):=dato;i:=i+1;d:=d 1;
end if;
end loop;
T(izda):=T(d);T(d):=pivote;
quicksort(T,izda,d 1);quicksort(T,d+1,dcha);
quicksort(T,izda,d1);quicksort(T,d+1,dcha);
end if;
end quicksort;

91

Das könnte Ihnen auch gefallen