FONNEU.PAS 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. const
  2. inp = 'input.txt';
  3. out = 'output.txt';
  4. N = 20;
  5. type
  6. TArr = array [1..n] of integer;
  7. Var
  8. F : text;
  9. A,R,tmp : ^TArr;
  10. Lser : 1..N;
  11. i,j : 1..N;
  12. Procedure InArr(FileName : string);
  13. var i : 1..n;
  14. Begin
  15. Assign(F,FileName);
  16. Reset(F);
  17. i := 1;
  18. repeat
  19. read(F,A^[i]);
  20. inc(i)
  21. until EOF(F);
  22. Close(F);
  23. end;
  24. Procedure Merge(beg,ends:word);
  25. var k,i,j,pos : 1..n;
  26. begin
  27. i := beg;j := beg+lser;pos:=beg;
  28. if J<=N then begin
  29. repeat
  30. if a^[i] < a^[j] then
  31. begin R^[pos] := A^[i];inc(i);end
  32. else
  33. begin R^[pos] := A^[j];inc(j);end;
  34. inc(pos);
  35. until (i>beg+lser-1) or (j>ends);
  36. for k := i to beg+lser-1 do begin R^[pos] := a^[k];inc(pos);end;
  37. for k := j to ends do begin R^[pos] := a^[k];inc(pos);end;
  38. end
  39. else
  40. for k := beg to N do begin R^[pos] := A^[k];inc(pos);end;
  41. end;
  42. Procedure OutArr(OutName:string);
  43. var i :1..n;
  44. Begin
  45. Assign(F,OutName);
  46. ReWrite(F);
  47. for i := 1 to n do if (i mod 8) = 0 then WriteLn(F,A^[i]:8) else
  48. Write(F,A^[i]:8);
  49. Close(F);
  50. End;
  51. BEGIN
  52. New(A);
  53. New(R);
  54. For i := 1 to n do begin A^[i] :=0;R^[i] := 0;end;
  55. InArr(inp);
  56. lser := 1;
  57. repeat
  58. i := 1;
  59. repeat
  60. if I+lser*2-1 < n then Merge(i,I+lser*2-1)
  61. else Merge(i,N);
  62. inc(i,lser*2);
  63. until i>n;
  64. tmp:=A;
  65. A := R;
  66. R:=tmp;
  67. lser := lser shl 1;
  68. until lser > N;
  69. OutArr(Out);
  70. Dispose(A);
  71. END.