Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2013, 20:13   #1
(Нафаня)
Пользователь
 
Аватар для (Нафаня)
 
Регистрация: 08.03.2011
Сообщений: 56
По умолчанию Не могу разобраться в сортировке естественным слиянием

Нашла в интернете код сортировки естественным слиянием. Не могли бы вы помочь в нем разобраться? Прокомментируйте пожалуйста
Код:
Procedure MergeSort(name:string; var f:text); 
Var
  s1,s2,a1,a2,where,tmp:integer;
  f1,f2:text;
Begin
  s1:=5;
  s2:=5; 
  Assign(f,name);
  Assign(f1,'fil1.txt');
  Assign(f2,'fil2.txt');
  While (s1>1) and (s2>=1) do
    begin
     where:=1;
     s1:=0;
     s2:=0;
     Reset(f);
     Rewrite(f1);
     Rewrite(f2);
     Read(f,a1);
     Write(f1,a1,' ');
     While not EOF(f) do
       begin
         read(f,a2);
         If (a2<a1) then
           begin
             Case where of
               1: begin
                    where:=2;
                    inc(s1);
                  End;
               2: begin
                    where:=1;
                    inc(s2);
                  End;
             End;
           End;
        Case where of
          1: write(f1,a2,' ');
          2: write(f2,a2,' ');
        End;
      a1:=a2;
    End;
  If where=2 then
    inc(s2)
  else
  inc(s1);
  Close(f);
  Close(f1);
  Close(f2);
  Rewrite(f);
  Reset(f1);
  Reset(f2);
  Read(f1,a1);
  Read(f2,a2);
  While (not EOF(f1)) and (not EOF(f2)) do
    begin
      If (a1<=a2) then
        begin
          Write(f,a1,' ');
          Read(f1,a1);
        End
      else
        begin
          Write(f,a2,' ');
          Read(f2,a2);
        End;
    End;
  While not EOF(f1) do
    begin
      tmp:=a1;
      Read(f1,a1);
      If not EOF(f1) then
        Write(f,tmp,' ')
      else
        Write(f,tmp);
    End;
  While not EOF(f2) do
    begin
      tmp:=a2;
      Read(f2,a2);
      If not EOF(f2) then
        Write(f,tmp,' ')
          else
            Write(f,tmp);
        End;
      Close(f); Close(f1); Close(f2);
    End;
  Erase(f1);
  Erase(f2);
End;
Если бы люди,вдруг,узнали,о чем я думаю... Со мной бы сначала перестали здороваться,а потом,вообще,на костре сожгли бы нафиг
(Нафаня) вне форума Ответить с цитированием
Старый 03.05.2013, 23:31   #2
cleac
Пользователь
 
Аватар для cleac
 
Регистрация: 19.04.2013
Сообщений: 27
По умолчанию

Ну, вообще-то, у вас две трети кода - ввод-ввывод в-из файла-файл.
Вот сортировка:
Код:
While (not EOF(f1)) and (not EOF(f2)) do
    begin
      If (a1<=a2) then
        begin
          Write(f,a1,' ');
          Read(f1,a1);
        End
      else
        begin
          Write(f,a2,' ');
          Read(f2,a2);
        End;
    End;
  While not EOF(f1) do
    begin
      tmp:=a1;
      Read(f1,a1);
      If not EOF(f1) then
        Write(f,tmp,' ')
      else
        Write(f,tmp);
    End;
  While not EOF(f2) do
    begin
      tmp:=a2;
      Read(f2,a2);
      If not EOF(f2) then
        Write(f,tmp,' ')
          else
            Write(f,tmp);
        End;
      Close(f); Close(f1); Close(f2);
    End;
Как оно работает?
Очень просто. Представьте себе колоду карт(неотсортированную), разделенную напополам - это ваши источники данных. Вы складываете их в определённом порядке, это ваши if'ы. Записываете вы их по возрастанию (если проводить паралель с картами - от 6-ки до туза =) )
Ну, вот и всё, тут и обьяснять-то нечего
All rights reserved©.
cleac вне форума Ответить с цитированием
Старый 04.05.2013, 12:44   #3
(Нафаня)
Пользователь
 
Аватар для (Нафаня)
 
Регистрация: 08.03.2011
Сообщений: 56
По умолчанию

Спасибо большое))
Если бы люди,вдруг,узнали,о чем я думаю... Со мной бы сначала перестали здороваться,а потом,вообще,на костре сожгли бы нафиг
(Нафаня) вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу разобраться в быстрой сортировке на Delphi OverTeam Помощь студентам 1 13.04.2012 15:04
Сортировка естественным слиянием TCH Помощь студентам 3 09.03.2011 20:44
Однофазная сортировка естественным слиянием dima154 Помощь студентам 0 20.11.2009 00:12
сортировка естественным слиянием ArtFul777 Паскаль, Turbo Pascal, PascalABC.NET 1 18.11.2008 19:36