mrgsrtl.pas

{ COMIENZO DE DESCRIPCION

Escribir un procedimiento
procedure MERGESORT(var L:lista); que ordena los elementos de una
lista usando el metodo de clasificacion por intercalacion. Es
decir, divide la lista en dos sublistas auxiliares L1 y L2 de
tamano similar, las ordena aplicando MERGESORT recursivamente y
luego intercala las sublistas: a) dividir L en dos sublistas L1, L2, 
b) clasificar L1 y L2 por MERGESORT , c) intercalar L1 y L2 en L. 
[Tomado 2do parcial de 2003, 3-Jun-2003]
Keywords: clasificacion, lista

FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: mrgsrtl.pas,v 1.5 2003/07/05 02:04:23 mstorti Exp mstorti $}

program mrgsrtl_p;

uses u_listpi;

type
  lista	= listpi ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure MERGE_SORT(var L : lista) ;
var
   L1,L2 : lista;
   p,p1,p2 : posicion;
   band	 : integer;
   Lp	 : ^lista;
   c,x1,x2	 : integer;
begin
   { Inicializa listas auxiliares }
   L1.anula;
   L2.anula;
   p := L.primero;
   { band va cambiando de signo para indicar si}
   { tomamos de L1 o l2}
   band := 1;

   { Va poniendo uno en L1 y otro en L2 }
   c:=0;
   while p<>L.fin do
   begin
      if band=1 then
	 { Toma de lista L1 }
	 Lp := @L1
      else
	 { Toma de lista L2 }
	 Lp := @L2;
      band := -band;

      { Lp es un puntero a la lista correpondiente}
      { (puede ser L1 o L2) }
      { Saca el primero elemento de L y lo inserta en Lp }
      Lp^.inserta(L.recupera(L.primero),Lp^.primero);
      L.suprime(L.primero);
      { Contamos cuantos elementos hay. Si hay menos de tres }
      { entonces las listas L1 y L2 vana tener menos de 2 y}
      { no hace falta ordenar. }
      c:=c+1;
   end;

   if c>2 then
   begin
      { Ordena aplicando recursivamente }
      MERGE_SORT(L1);
      MERGE_SORT(L2);
   end;

   { Intercala. Va tomando el menor de los dos}
   { primeros elementos de L1 y L2 y lo inserta}
   { al fin de L }
   p1 := L1.primero;
   p2 := L2.primero;
   while (p1<>L1.fin) and (p2<>L2.fin) do
   begin
      x1 := L1.recupera(p1);
      x2 := L2.recupera(p2);
      if x1then
      begin
	 L.inserta(x1,L.fin);
	 L1.suprime(p1);
	 p1:=L1.primero;
      end
      else
      begin
	 L.inserta(x2,L.fin);
	 L2.suprime(p2);
	 p2:=L2.primero;
      end;
   end;

   { Pone todo el resto de L1 en L }
   while p1<>L1.fin do
   begin
      L.inserta(L1.recupera(p1),L.fin);
      L1.suprime(p1);
      p1 := L1.primero;
   end;

   { Pone todo el resto de L2 en L }
   while p2<>L2.fin do
   begin
      L.inserta(L2.recupera(p2),L.fin);
      L2.suprime(L2.primero);
      p2 := L2.primero;
   end;
   
end;	 

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
   L : Lista;
   k : integer;
begin
   { genera una lista aleatoria }
   L.anula;
   randomize;
   for k:=1 to 20 do
      L.inserta(random(20),L.primero);
   L.imprime('antes');

   { ordena }
   MERGE_SORT(L);
   
   L.imprime('despues');
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.