Cod sursa(job #927853)

Utilizator patrascu_eugen96Patrascu Eugen patrascu_eugen96 Data 26 martie 2013 08:52:37
Problema Sortare prin comparare Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.76 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.