bubl.pas

{-<->-+-<->-+-<->-+-<->-+-<->-+-<->-+-<->-+-<->-+-<->-+-<->-
COMIENZO DE DESCRIPCION

Escribir un procedimiento procedure BURBUJA(var L:lista); que
ordena los elementos de una lista L mediante el metodo de
clasificacion por burbujas. Como en listas simplemente enlazadas no
es conveniente avanzar hacia el principio de la lista por una
cuestion de eficiencia, el algoritmo de burbuja se modifica de
manera de que los elementos mas grandes viajan hacia el fin.
[Tomado 2do Parcial de 2003, 3-Jun-2003]
Keywords: lista, clasificacion

FIN DE DESCRIPCION
$Id: bubl.pas,v 1.3 2003/07/31 13:52:49 mstorti Exp mstorti $
-<->-+-<->-+-<->-+-<->-+-<->-+-<->-+-<->-+-<->-+-<->-+-<->-} 
program bubble_p;

uses u_listpi;

type
  lista	= listpi ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure bubble(var L : lista) ;
var
   p,q	 : posicion;
   n,i,j,ep,eq : integer;
begin
   { Cuenta cuantos elementos `n' hay en L }
   n:=0;
   p := L.primero;
   while p<>L.fin do
   begin
      n := n+1;
      p := L.siguiente(p);
   end;

   { Va aplicando burbuja, pero desde adelante hacia atras}
   { ya que en listas enlazadas solo se puede avanzar}
   { (en forma eficiente) hacia atras }
   for j:=n downto 2 do
   begin
      p:=L.primero;
      for i:=1 to j-1 do
      begin
	 ep := L.recupera(p);
	 q:=L.siguiente(p);
	 eq := L.recupera(q);
	 if ep>eq then
	 begin
	    { Intercambia }
	    L.suprime(q);
	    L.inserta(eq,p);
	    p:=L.siguiente(p);
	 end
	 else
	    { Avanza }
	    p:=q;
     end;
   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 }
   bubble(L);
   
   L.imprime('despues');
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.