{Sravnenie vremeni dlya sortirovki massivov
treh vidov metodom slivaniya
Massivy : Byte, Integer, Real
Razmer maksimaljnyj
Generator sluchajnyh chisel, no znacheniya
dolzhny bytj odinakovye v 3 mssivah
Vremya schitatj dlya sozdannogo, uporyadochennogo
i dlya naoborot uporyadochennogo massiva
Rezuljtaty v vide tablicy

Salidzina kartosanas laiku saliesanas metodei
Tris tipu mainigo masivi: byte, integer, real
Masivu izmeri- maksimalie
Sakuma vertibas veido, izmantojot gadijuma
skaitlu generatoru
Kartosanas veikt izveidotajam, sakartotam un
preteja seciba sakartotam masivam
Rezultatus izvadit tabulas forma}

uses crt,dos;
const
     n=100;
type
    mas1=array[1..n] of byte;
    mas2=array[1..n] of integer;
    mas3=array[1..n] of real;

var
   a:mas1;
   b:mas2;
   c:mas3;
   sk:longint;
   i,j,k,t:longint;
   shag ,x:longint;
   lv:boolean;
   h,min,sec,msec:word;
   h1,min1,sec1,msec1: word;
   h2,min2,sec2,msec2: word;

     procedure merge1(var ar:mas1; n:byte);
       procedure Slit( k, q: integer);
       var m: byte; i,j,t: byte;d: mas1;
       begin m:=k+(q-k) div 2;
       i:=k; j:=succ(m); t := 1;
       while (i<=m) and (j<=q) do
        begin if ar[i]<=ar[j] then begin
          d[t]:=ar[i]; Inc(i) end
          else begin d[t]:=ar[j]; Inc(j)
          end; inc(t)
       end;
       while i<=m do begin d[t]:=ar[i];
             inc(i); inc(t) end;
       while j<=q do begin d[t]:=ar[j];
             inc(j); inc(t) end;
       for i:=1 to pred(t) do ar[pred(k+i)]:=d[i]
       end;

       procedure sort(i,j:integer);
       var t: byte;
       begin if i>=j then exit;
       if j-i=1 then begin
          if ar[j]<ar[i] then begin
             t:=ar[i]; ar[i]:=ar[j]; ar[j]:=t
          end end
          else begin
          sort(i,i+(j-i) div 2);
          sort(i+(j-i) div 2+1,j);
          slit(i, j)
          end; end;
     begin sort(1,n);
     end;

     procedure merge2(var ar:mas2; n:integer);
       procedure Slit( k, q: integer);
       var m: integer; i,j,t: integer;d: mas2;
       begin m:=k+(q-k) div 2;
       i:=k; j:=succ(m); t := 1;
       while (i<=m) and (j<=q) do
        begin if ar[i]<=ar[j] then begin
          d[t]:=ar[i]; Inc(i) end
          else begin d[t]:=ar[j]; Inc(j)
          end; inc(t)
       end;
       while i<=m do begin d[t]:=ar[i];
             inc(i); inc(t) end;
       while j<=q do begin d[t]:=ar[j];
             inc(j); inc(t) end;
       for i:=1 to pred(t) do ar[pred(k+i)]:=d[i]
       end;

       procedure sort(i,j:integer);
       var t: integer;
       begin if i>=j then exit;
       if j-i=1 then begin
          if ar[j]<ar[i] then begin
             t:=ar[i]; ar[i]:=ar[j]; ar[j]:=t
          end end
          else begin
          sort(i,i+(j-i) div 2);
          sort(i+(j-i) div 2+1,j);
          slit(i, j)
          end; end;
     begin sort(1,n);
     end;

{     procedure merge3(var ar:mas3; n:real);
       procedure Slit( k, q: integer);
       var m: integer; i,j,t: integer;d: mas3;
       begin m:=k+(q-k) div 2;
       i:=k; j:=succ(m); t := 1;
       while (i<=m) and (j<=q) do
        begin if ar[i]<=ar[j] then begin
          d[t]:=ar[i]; Inc(i) end
          else begin d[t]:=ar[j]; Inc(j)
          end; inc(t)
       end;
       while i<=m do begin d[t]:=ar[i];
             inc(i); inc(t) end;
       while j<=q do begin d[t]:=ar[j];
             inc(j); inc(t) end;
       for i:=1 to pred(t) do ar[pred(k+i)]:=d[i]
       end;

       procedure sort(i,j:integer);
       var t: real;
       begin if i>=j then exit;
       if j-i=1 then begin
          if ar[j]<ar[i] then begin
             t:=ar[i]; ar[i]:=ar[j]; ar[j]:=t
          end end
          else begin
          sort(i,i+(j-i) div 2);
          sort(i+(j-i) div 2+1,j);
          slit(i, j)
          end; end;
     begin sort(1,n);
     end; }

     procedure merge1dil(var ar:mas1; n:byte);
       procedure Slit( k, q: integer);
       var m: byte; i,j,t: byte;d: mas1;
       begin m:=k+(q-k) div 2;
       i:=k; j:=succ(m); t := 1;
       while (i<=m) and (j<=q) do
        begin if ar[i]>=ar[j] then begin
          d[t]:=ar[i]; Inc(i) end
          else begin d[t]:=ar[j]; Inc(j)
          end; inc(t)
       end;
       while i<=m do begin d[t]:=ar[i];
             inc(i); inc(t) end;
       while j<=q do begin d[t]:=ar[j];
             inc(j); inc(t) end;
       for i:=1 to pred(t) do ar[pred(k+i)]:=d[i]
       end;

       procedure sort(i,j:integer);
       var t: byte;
       begin if i<=j then exit;
       if j-i=1 then begin
          if ar[j]>ar[i] then begin
             t:=ar[i]; ar[i]:=ar[j]; ar[j]:=t
          end end
          else begin
          sort(i,i+(j-i) div 2);
          sort(i+(j-i) div 2+1,j);
          slit(i, j)
          end; end;
     begin sort(1,n);
     end;

     procedure merge2dil(var ar:mas2; n:integer);
       procedure Slit( k, q: integer);
       var m: integer; i,j,t: integer;d: mas2;
       begin m:=k+(q-k) div 2;
       i:=k; j:=succ(m); t := 1;
       while (i<=m) and (j<=q) do
        begin if ar[i]>=ar[j] then begin
          d[t]:=ar[i]; Inc(i) end
          else begin d[t]:=ar[j]; Inc(j)
          end; inc(t)
       end;
       while i<=m do begin d[t]:=ar[i];
             inc(i); inc(t) end;
       while j<=q do begin d[t]:=ar[j];
             inc(j); inc(t) end;
       for i:=1 to pred(t) do ar[pred(k+i)]:=d[i]
       end;

       procedure sort(i,j:integer);
       var t: integer;
       begin if i<j then exit;
       if j-i=1 then begin
          if ar[j]<ar[i] then begin
             t:=ar[i]; ar[i]:=ar[j]; ar[j]:=t
          end end
          else begin
          sort(i,i+(j-i) div 2);
          sort(i+(j-i) div 2+1,j);
          slit(i, j)
          end; end;
     begin sort(1,n);
     end;

    { procedure merge3dil(var ar:mas3; n:real);
       procedure Slit( k, q: longint);
       var m: longint; i,j,t: integer;d: mas3;
       begin m:=k+(q-k) div 2;
       i:=k; j:=succ(m); t := 1;
       while (i<=m) and (j<=q) do
        begin if ar[i]>=ar[j] then begin
          d[t]:=ar[i]; Inc(i) end
          else begin d[t]:=ar[j]; Inc(j)
          end; inc(t)
       end;
       while i<=m do begin d[t]:=ar[i];
             inc(i); inc(t) end;
       while j<=q do begin d[t]:=ar[j];
             inc(j); inc(t) end;
       for i:=1 to pred(t) do ar[pred(k+i)]:=d[i]
       end;

       procedure sort(i,j:longint);
       var t: real;
       begin if i<=j then exit;
       if j-i=1 then begin
          if ar[j]>ar[i] then begin
             t:=ar[i]; ar[i]:=ar[j]; ar[j]:=t
          end end
          else begin
          sort(i,i+(j-i) div 2);
          sort(i+(j-i) div 2+1,j);
          slit(i, j)
          end; end;
     begin sort(1,n);
     end;}

begin
     clrscr;
     randomize;
     for i:=1 to n do
     begin a[i]:=random(256);
         b[i]:=a[i]; c[i]:=a[i];
     end;

     h:=0; min:=0; sec:=0; msec:=0; sk:=0;
     settime(h,min,sec,msec);
     merge1(a,n);
     gettime(h,min,sec,msec);
     writeln('       Massiv uporyadochennyj v vozrastayuwej posledovateljnosti');
     for i:=1 to 80 do
     write('-');
     write('Byte | ' );
     write('Vremya | ',h,' st ' ,min,' min ' ,sec,' sec ',msec:2,' msec |');
     writeln(' sravneniya | ',sk);
     h1:=0; min1:=0; sec1:=0; msec1:=0; sk:=0;
     settime(h1,min1,sec1,msec1);
     merge2(b,n);
     gettime(h1,min1,sec1,msec1);
     write('Integer | ' );
     write('Vremya | ',h1,' st ' ,min1,' min ' ,sec1,' sec ',msec1:2,' msec |');
     writeln(' sravneniya | ',sk);
     for i:=1 to 80 do
         write('-');
     writeln;
    { h2:=0; min2:=0; sec2:=0; msec2:=0; sk:=0;
     settime(h2,min2,sec2,msec2);
     merge3dil(a,n);
     gettime(h2,min2,sec2,msec2);
     write('Real| ' );
     write('Vremya | ',h2,' st ' ,min2,' min ' ,sec2,' sec ',msec2:2,' msec |');
     writeln(' sravneniya | ',sk);
     for i:=1 to 80 do
         write('-');
     writeln;}
     h:=0; min:=0; sec:=0; msec:=0; sk:=0;
     settime(h,min,sec,msec);
     merge1(a,n);
     gettime(h,min,sec,msec);
     writeln('       Uporyadochennyj massiv ');
     for i:=1 to 80 do
         write('-');
     write('Byte | ' );
     write('Vremya | ',h,' st ' ,min,' min ' ,sec,' sec ',msec:2,' msec |');
     writeln(' sravneniya | ',sk);
     h1:=0; min1:=0; sec1:=0; msec1:=0; sk:=0;
     settime(h1,min1,sec1,msec1);
     merge2(b,n);
     gettime(h1,min1,sec1,msec1);
     write('Integer | ' );
     write('Vremya | ',h1,' st ' ,min1,' min ' ,sec1,' sec ',msec1:2,' msec |');
     writeln(' sravneniya | ',sk);
     for i:=1 to 80 do
         write('-');
     writeln;
     h2:=0; min2:=0; sec2:=0; msec2:=0; sk:=0;
     {settime(h2,min2,sec2,msec2);
     merge3(c,n);
     gettime(h2,min2,sec2,msec2);
     write(' Real | ' );
     write('Vremya | ',h2,' st ' ,min2,' min ' ,sec2,' sec ',msec2:2,' msec |');
     writeln(' sravneniya | ',sk);
     for i:=1 to 80 do
         write('-');
     writeln;}
     h:=0; min:=0; sec:=0; msec:=0;  sk:=0;
     settime(h,min,sec,msec);
     merge1dil(a,n);
     gettime(h,min,sec,msec);
     writeln('       Uporyadochennyj v drugoj posledovateljnosti massiv ');
     for i:=1 to 80 do
         write('-');
     write('Byte | ' );
     write('Vremya | ',h,' st ' ,min,' min ' ,sec,' sec ',msec:2,' msec |');
     writeln(' sravneniya | ',sk);
     h1:=0; min1:=0; sec1:=0; msec1:=0; sk:=0;
     settime(h1,min1,sec1,msec1);
     merge2dil(b,n);
     gettime(h1,min1,sec1,msec1);
     write('Integer | ' );
     write('Vremya | ',h1,' st ' ,min1,' min ' ,sec1,' sec ',msec1:2,' msec |');
     writeln(' sravneniya | ',sk);
     for i:=1 to 80 do
         write('-');
     writeln;
     h2:=0; min2:=0; sec2:=0; msec2:=0; sk:=0;
     settime(h2,min2,sec2,msec2);
     {merge3dil(c,n);
     gettime(h2,min2,sec2,msec2);
     write(' Real| ' );
     write('Vremya | ',h2,' st ' ,min2,' min ' ,sec2,' sec ',msec2:2,' msec |');
     writeln(' sravneniya | ',sk);
     for i:=1 to 80 do
     write('-');
     writeln;}
readkey;
end.