Внешняя сортировка(естественное и прямое слияния)

Задача: Разработать программу для сортировки текстового файла, используя сортировку прямым слиянием и естественным слиянием. Измерить время, требуемое для сортировки файла разными способами. Подпрограммы сортировки реализовать в отдельном модуле.

    program Lab9;
{Разработать программу для сортировки текстового файла, используя сортировку прямым слиянием и естественным слиянием. 
Измерить время, требуемое для сортировки файла разными способами. Подпрограммы сортировки реализовать в отдельном модуле.}
uses
  UnitRealization;

var
  F, F1, F2: TextFile;
  
begin
  if(ParamCount <> 3) then
    Writeln('Недостаточно параметров.')
  else
    begin
      try
        Assign(F, ParamStr(1));
        Assign(F1, ParamStr(2));
        Assign(F2, ParamStr(3));
        Reset(F);
        if(SeekEOF(F)) then
          begin
            CloseFile(F);
            Writeln('Файл пуст.');
            exit;
          end;
      except 
        on System.IO.IOException do
          begin
            Writeln('Невозможно открыть файл ', ParamStr(1));
            Exit;
          end;
      end;
      CloseFile(F);
      NaturalMerge(F, F1, F2);
    end;
end.

    Unit
  UnitRealization;
  
Interface

Procedure NaturalMerge(const F, F1, F2: TextFile);
  
Implementation

Procedure NaturalMerge(const F, F1, F2: TextFile);
var
  a, b, save_to, swap, subgroup_1, subgroup_2: Integer;
begin
  subgroup_1 := 10000;
  subgroup_2 := 10000;
  while(subgroup_1 <> 1) do
    begin
      save_to := 1;
      subgroup_1 := 0;
      subgroup_2 := 0;
      Reset(F);
      Rewrite(F1);
      Rewrite(F2);
      Read(F, a);
      Write(F1, a, ' ');
      while(not(SeekEOF(F))) do
        begin
          Read(F, b);
          if(a > b) then
            begin
              case save_to of
              1: begin
                 save_to := 2;
                 subgroup_1 += 1;
                 end;
              2: begin
                 save_to := 1;
                 subgroup_2 += 1;
                 end;
              end;
            end;
          case save_to of
          1: Write(F1, b, ' ');
          2: Write(F2, b, ' ');
            end;
          a := b;
        end;
       if(save_to = 2) then
         subgroup_2 += 1
       else
         subgroup_1 += 1;
       CloseFile(F);
       CloseFile(F1);
       CloseFile(F2);
       Rewrite(F);
       Reset(F1);
       Reset(F2);
       Read(F1, a);
       Read(F2, b);
       while(not(SeekEOF(F1)) and not(SeekEOF(F2))) do
         begin
           if(a <= b) then
            begin
              Write(F, a, ' ');
              Read(F1, a);
            end
           else
            begin
              Write(F, b, ' ');
              Read(F2, b);
            end;
         end;
        while(not(SeekEOF(F1))) do
         begin
           swap := a;
           Read(F1, a);
           if(not(SeekEOF(F1))) then 
             Write(F, swap, ' ')
           else 
             Write(F, swap);
         end;
        while(not(SeekEOF(F2))) do
         begin
           swap := b;
           Read(F2, b);
           if(not(SeekEOF(F2))) then 
             Write(F, swap, ' ')
           else 
             Write(F, swap);
         end;
      CloseFile(F);
      CloseFile(F1);
      CloseFile(F2);
    end;
  Erase(F1);
  Erase(F2);
end;
  
end.

Сортировка естественным слиянием почему-то не работает, и я не понимаю, почему. Возможно, проблема в условии while на число подгрупп, относящихся к файлам F1 и F2. По идее, так как первый элемент записывается всегда в файл F1, то признаком конца сортировки является число подгрупп, относящихся к файлу F1, равное единице, но даже тут неведомое творится. Помогите, эксперты. В дополнение ко всему этому очень часто возникает ошибка о том, что я вышёл за пределы файла, и считать ничего нельзя.


Ответы (0 шт):