Cod sursa(job #694292)

Utilizator andrei_toaderToader Andrei Sorin andrei_toader Data 27 februarie 2012 19:43:04
Problema Sortare prin comparare Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.22 kb
program merge_sort;
var f,g:text;
    v,b:array[1..500000] of longint;
    n,i:longint;
    bufin,bufout:array [1..65000] of char;

procedure merge (st,dr,mijloc:longint);
  var  k,i,j:longint;

begin
  i:=st; j:=mijloc+1;   k:=0;
  while (i<=mijloc) and (j<=dr) do
   if v[i]<=v[j] then
   begin
    k:=k+1; b[k]:=v[i]; i:=i+1;
   end
   else
   begin
    k:=k+1; b[k]:=v[j]; j:=j+1;
   end;
  if i<=mijloc then
   for j:=i to mijloc do
   begin
    k:=k+1; b[k]:=v[j];
   end
   else
    for i:=j to dr do
    begin
     k:=k+1; b[k]:=v[i];
    end;
   k:=1;
   for i:=st to dr do
   begin
    v[i]:=b[k]; k:=k+1;
   end;
end;

procedure divide (st,dr:longint);
var aux,mijloc:longint;
begin
 if dr-st<=1 then
 begin
  if v[st]>v[dr] then
  begin
   aux:=v[st]; v[st]:=v[dr]; v[dr]:=aux;
  end;
 end
 else
 begin
  mijloc:=(st+dr) div 2;
  divide (st,mijloc);
  divide (mijloc+1,dr);
  merge (st,dr,mijloc);
 end;
end;

begin
 assign (f,'algsort.in'); reset (F);
 assign(g,'algsort.out'); rewrite (g);
 settextbuf (f,bufin);
 settextbuf (g,bufout);
 readln (f,n);
 for i:=1 to n do
  read (f,v[i]);
 divide (1,n);
 for i:=1 to n do
  write (g,v[i], ' ');
 close (F);
 close (g);
end.