Procedure MergeSort(var v:vetor;tam:integer);
var
   v2 : Vetor;
Procedure Ordena(l,r:integer);
var
   meio,i1,i2,ia : integer;
begin
   if l<r then
   begin
      meio := (l+r) div 2;
      Ordena(l,meio);
      Ordena(meio+1,r);

      i1 := l;
      i2 := meio+1;
      ia := l;
      while (i1<=meio) AND (i2 <=r) do
      begin
         if v[i1] < v[i2] then
          begin
            v2[ia] := v[i1];
            i1:=i1+1;
          end
         else
          begin
            v2[ia] := v[i2];
            i2:=i2+1;
          end;
         inc(ia);
      end;
      if i1 > meio then
         while i2 <=r do
         begin
            v2[ia] := v[i2];
            inc(i2);
            inc(ia);
         end
      else
         while i1 <= meio do
         begin
            v2[ia] := v[i1];
            inc(i1);
            inc(ia);
         end;
      for ia := l to r do
         v[ia] := v2[ia];
   end;
end;

begin
   Ordena(1,tam);
end;