Advertisement
Guest User

Untitled

a guest
Oct 28th, 2016
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.71 KB | None | 0 0
  1. program problemaUno;
  2. Const MAX = 500;
  3. type TMerge = array [1 .. MAX] of Integer;
  4. Procedure imprimirDatos(var arrO:TMerge; numDat: Integer);
  5. var nomAOut: String;
  6.     aOut: Text;
  7.     i: Integer;
  8. begin
  9.   write('Escriba el nombre del archivo de salida: ');
  10.   readln(nomAOut);
  11.   assign(aOut,nomAOut);
  12.   rewrite(aOut);
  13.   for i:=1 to numDat do begin
  14.   write(aOut, arrO[i], ' ');
  15.   end;
  16.   close(aOut);
  17. end;
  18.  
  19. Procedure merge(var arrO, arr1, arr2:TMerge; numDat, m, n:Integer);
  20. var k, i, j :Integer;
  21. begin
  22.   k:=1; i:=1; j:=1;
  23.   while (i <> m) and (j <> n) do begin
  24.     if arr1[i] < arr2[j] then begin
  25.     arrO[k] := arr1[i];
  26.     k:= k + 1;
  27.     i:= i + 1;
  28.     end;
  29.     if arr1[i] > arr2[j] then begin
  30.     arrO[k] := arr2[j];
  31.     k:= k + 1;
  32.     j:= j + 1;
  33.     end;
  34.   end;
  35.   if i = m then begin
  36.   arrO[k]:= arr1[i];
  37.   k:=k+1;
  38.   while k <> numDat+1 do begin
  39.     arrO[k]:= arr1[j];
  40.     j:= j+1;
  41.     k:= k+1;
  42.   end;
  43.   end;
  44.   if j = n then begin
  45.   arrO[k]:= arr2[j];
  46.   k:=k+1;
  47.   while k <> numDat+1 do begin
  48.     arrO[k]:= arr1[i];
  49.     i:= i+1;
  50.     k:= k+1;
  51.   end;
  52.   end;
  53. end;
  54.  
  55. Procedure divideArr(var arrO, arr1, arr2:TMerge; numDat:Integer; var m, n: Integer);
  56. var i :Integer;
  57. begin
  58.   if arrO[1] < arrO[2] then begin
  59.   m:= m + 1;
  60.   arr1[m]:= arrO[1];
  61.   end;
  62.   if arrO[2] < arrO[1] then begin
  63.   n:= n + 1;
  64.   arr2[n]:= arrO[1];
  65.   end;
  66.   for i:=1 to numDat-1 do begin
  67.     if arrO[i] < arrO[i+1] then begin
  68.     m:= m+1;
  69.     arr1[m] := arrO[i+1];
  70.     end;
  71.     if arrO[i] > arrO[i+1] then begin
  72.     n:= n+1;
  73.     arr2[n] := arrO[i+1];
  74.     end;
  75.   end;
  76. end;
  77. Function verificaOrden(var arrO: TMerge; numDat:Integer):Boolean;
  78. var i:Integer;
  79.     aux:Boolean;
  80. begin
  81.  i:=1;
  82.  aux:= True;
  83.  while (i <> numDat) and aux do begin
  84.   aux:= arrO[i] < arrO[i+1];
  85.   i:= i+1;
  86.   end;
  87. verificaOrden:= aux;
  88. end;
  89.  
  90. Procedure ordenarMerge(var arrO, arr1, arr2:TMerge; numDat:Integer);
  91. var aux: Boolean;
  92.     m, n: Integer;
  93. begin
  94.   aux:= verificaOrden(arrO, numDat);
  95.   while not(aux) do begin
  96.     m:= 0; n:=0;
  97.     divideArr(arrO, arr1, arr2, numDat, m, n);
  98.     merge(arrO, arr1, arr2, numDat, m, n);
  99.     aux:= verificaOrden(arrO, numDat);
  100.   end;
  101.  
  102. end;
  103.  
  104. Procedure leerDatosArrO (var arrO: TMerge; var numDat: Integer);
  105. var nomAIni: String;
  106.     aIni: Text;
  107. begin
  108.   write('Escriba el nombre del archivo con los datos de entrada: ');
  109.   readln(nomAIni);
  110.   assign(aIni, nomAIni);
  111.   reset(aIni);
  112.   while not eof(aIni) do begin
  113.   inc(numDat);
  114.   read(aIni,arrO[numDat]);
  115.   end;
  116.   close(aIni);
  117. end;
  118.  
  119. var arrO, arr1, arr2: TMerge;
  120.   numDat: Integer;
  121. begin
  122.   numDat:= 0;
  123.   leerDatosArrO(arrO, numDat);
  124.   ordenarMerge(arrO, arr1, arr2, numDat);
  125.   imprimirDatos(arrO, numDat);
  126. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement