Cod sursa(job #895725)

Utilizator andrei_toaderToader Andrei Sorin andrei_toader Data 27 februarie 2013 12:22:00
Problema Sortare prin comparare Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.2 kb
program merge_sort;
var f,g:text;
    n,i:longint;
    v,b:array[1..500000] of longint;
    bufin,bufout:array[1..65000] of byte;

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

procedure sort (st,dr:longint);
var mijloc:longint;
    aux: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;
   sort(st,mijloc);
   sort(mijloc+1,dr);
   interclasare (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]);
 sort(1,n);
 for i:=1 to n do
  write (g,v[i],' ');
 close (F); close (g);
end.