На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Profi, juice
  
> Внешняя сортировка(естественное и прямое слияния)
    Задача: Разработать программу для сортировки текстового файла, используя сортировку прямым слиянием и естественным слиянием. Измерить время, требуемое для сортировки файла разными способами. Подпрограммы сортировки реализовать в отдельном модуле.
    ExpandedWrap disabled
      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.


    ExpandedWrap disabled
      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;
        flag, flag_1, flag_2: Boolean;
      begin
        subgroup_1 := 10000;
        subgroup_2 := 10000;
        flag := False;
        while(not(flag)) do
        //(subgroup_1 <> 1) or (subgroup_2 <> 1)
          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);
              if(subgroup_1 = 1) then
               flag := True;
            end;
        Erase(F1);
        Erase(F2);
      end;
       
      end.

    Сортировка естественным слиянием почему-то не работает, и я не понимаю, почему. Возможно, проблема в условии while на число подгрупп, относящихся к файлам F1 и F2. По идее, так как первый элемент записывается всегда в файл F1, то признаком конца сортировки является число подгрупп, относящихся к файлу F1, равное единице, но даже тут неведомое творится. Помогите, эксперты. В дополнение ко всему этому очень часто возникает ошибка о том, что я вышёл за пределы файла, и считать ничего нельзя. Почему не считываются последние числа файлов F1 и F2? Например, если дана последовательность {5, 6, 7, 1, 2, 3}, то результатом подпрограммы будет {1, 2, 5, 6}. Как сделать так, чтобы последние числа не игнорировались? Подрограмма написана в среде PascalABC.NET
    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0167 ]   [ 15 queries used ]   [ Generated: 3.08.21, 07:55 GMT ]