mrgsrtc.pas
{ COMIENZO DE DESCRIPCION
Escribir un procedimiento procedure MERGESORT(var L:lista); que ordena
los elementos de una cola usando el metodo de clasificacion por
intercalacion. Es decir, divide la cola en dos subcolas auxiliares
C1 y C2 de tamano similar, las ordena aplicando MERGESORT
recursivamente y luego intercala las subcolas: a) dividir C en dos
subcolas C1, C2, b) clasificar C1 y C2 por MERGESORT , c) intercalar
C1 y C2 en C. [Tomado 2do parcial de 2003, 3-Jun-2003] Keywords:
clasificacion, cola
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: mrgsrtc.pas,v 1.2 2003/07/31 13:18:01 mstorti Exp mstorti $}
program mrgsrtl_p;
uses u_colapi;
type
cola = colapi ;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure MERGE_SORT(var C : cola) ;
var
C1,C2 : cola;
band : integer;
Cp : ^cola;
cnt,x1,x2 : integer;
begin
{ Inicializa colas auxiliares }
C1.anula;
C2.anula;
{ band va cambiando de signo para indicar si}
{ tomamos de C1 o l2}
band := 1;
{ Va poniendo uno en C1 y otro en C2 }
{ Finalmente quedan ((n+1) div 2) en C1 y (n div 2) en C2 }
cnt:=0;
while not C.vacia do
begin
if band=1 then
{ Toma de cola C1 }
Cp := @C1
else
{ Toma de cola C2 }
Cp := @C2;
band := -band;
{ Cp es un puntero a la cola correpondiente}
{ (puede ser C1 o C2) }
{ Saca el primero elemento de C y lo inserta en Cp }
Cp^.pone(C.frente);
C.quita;
{ Contamos cuantos elementos hay. Si hay menos de tres }
{ entonces las colas C1 y C2 vana tener menos de 2 y}
{ no hace falta ordenar. }
cnt:=cnt+1;
end;
if cnt>2 then
begin
{ Ordena aplicando recursivamente }
MERGE_SORT(C1);
MERGE_SORT(C2);
end;
{ Intercala. Va tomando el menor de los dos}
{ primeros elementos de C1 y C2 y lo inserta}
{ al fin de C }
while (not C1.vacia) and (not C2.vacia) do
begin
x1 := C1.frente;
x2 := C2.frente;
if x1then
begin
C.pone(x1);
C1.quita;
end
else
begin
C.pone(x2);
C2.quita;
end;
end;
{ Pone todo el resto de C1 en C }
while not C1.vacia do
begin
C.pone(C1.frente);
C1.quita;
end;
{ Pone todo el resto de C2 en C }
while not C2.vacia do
begin
C.pone(C2.frente);
C2.quita;
end;
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
C : Cola;
k,v : integer;
begin
{ genera una cola aleatoria }
C.imprime('antes');
C.anula;
randomize;
for k:=1 to 20 do
begin
v := random(40);
write(v,' ');
C.pone(v);
end;
writeln;
{ ordena }
MERGE_SORT(C);
C.imprime('despues');
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.