<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=421525&amp;view=findpost&amp;p=3848255</guid>
        <pubDate>Fri, 18 Jun 2021 07:59:09 +0000</pubDate>
        <title>Внешняя сортировка(естественное и прямое слияния)</title>
        <link>https://forum.sources.ru/index.php?showtopic=421525&amp;view=findpost&amp;p=3848255</link>
        <description><![CDATA[Alexandrietz: Задача: Разработать программу для сортировки текстового файла, используя сортировку прямым слиянием и естественным слиянием. Измерить время, требуемое для сортировки файла разными способами. Подпрограммы сортировки реализовать в отдельном модуле.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">program Lab9;</div><div class="code_line">{Разработать программу для сортировки текстового файла, используя сортировку прямым слиянием и естественным слиянием. </div><div class="code_line">Измерить время, требуемое для сортировки файла разными способами. Подпрограммы сортировки реализовать в отдельном модуле.}</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;UnitRealization;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;F, F1, F2: TextFile;</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if(ParamCount &#60;&#62; 3) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(&#39;Недостаточно параметров.&#39;)</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Assign(F, ParamStr(1));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Assign(F1, ParamStr(2));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Assign(F2, ParamStr(3));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Reset(F);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(SeekEOF(F)) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseFile(F);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Writeln(&#39;Файл пуст.&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;except </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;on System.IO.IOException do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Writeln(&#39;Невозможно открыть файл &#39;, ParamStr(1));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;CloseFile(F);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;NaturalMerge(F, F1, F2);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Unit</div><div class="code_line">&nbsp;&nbsp;UnitRealization;</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">Interface</div><div class="code_line">&nbsp;</div><div class="code_line">Procedure NaturalMerge(const F, F1, F2: TextFile);</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">Implementation</div><div class="code_line">&nbsp;</div><div class="code_line">Procedure NaturalMerge(const F, F1, F2: TextFile);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;a, b, save_to, swap, subgroup_1, subgroup_2: Integer;</div><div class="code_line">&nbsp;&nbsp;flag, flag_1, flag_2: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;subgroup_1 := 10000;</div><div class="code_line">&nbsp;&nbsp;subgroup_2 := 10000;</div><div class="code_line">&nbsp;&nbsp;flag := False;</div><div class="code_line">&nbsp;&nbsp;while(not(flag)) do</div><div class="code_line">&nbsp;&nbsp;//(subgroup_1 &#60;&#62; 1) or (subgroup_2 &#60;&#62; 1)</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;save_to := 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;subgroup_1 := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;subgroup_2 := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Reset(F);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Rewrite(F1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Rewrite(F2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Read(F, a);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Write(F1, a, &#39; &#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;while(not(SeekEOF(F))) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Read(F, b);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(a &#62; b) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case save_to of</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1: begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; save_to := 2;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; subgroup_1 += 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2: begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; save_to := 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; subgroup_2 += 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case save_to of</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1: Write(F1, b, &#39; &#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2: Write(F2, b, &#39; &#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;a := b;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if(save_to = 2) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; subgroup_2 += 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; subgroup_1 += 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; CloseFile(F);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; CloseFile(F1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; CloseFile(F2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Rewrite(F);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Reset(F1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Reset(F2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Read(F1, a);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Read(F2, b);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; while(not(SeekEOF(F1)) and not(SeekEOF(F2))) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(a &#60;= b) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Write(F, a, &#39; &#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Read(F1, a);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Write(F, b, &#39; &#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Read(F2, b);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while(not(SeekEOF(F1))) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; swap := a;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Read(F1, a);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(not(SeekEOF(F1))) then </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Write(F, swap, &#39; &#39;)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Write(F, swap);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while(not(SeekEOF(F2))) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; swap := b;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Read(F2, b);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(not(SeekEOF(F2))) then </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Write(F, swap, &#39; &#39;)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Write(F, swap);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CloseFile(F);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CloseFile(F1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CloseFile(F2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(subgroup_1 = 1) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; flag := True;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;Erase(F1);</div><div class="code_line">&nbsp;&nbsp;Erase(F2);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
Сортировка естественным слиянием почему-то не работает, и я не понимаю, почему. Возможно, проблема в условии while на число подгрупп, относящихся к файлам F1 и F2. По идее, так как первый элемент записывается всегда в файл F1, то признаком конца сортировки является число подгрупп, относящихся к файлу F1, равное единице, но даже тут неведомое творится. Помогите, эксперты. В дополнение ко всему этому очень часто возникает ошибка о том, что я вышёл за пределы файла, и считать ничего нельзя. Почему не считываются последние числа файлов F1 и F2? Например, если дана последовательность {5, 6, 7, 1, 2, 3}, то результатом подпрограммы будет {1, 2, 5, 6}. Как сделать так, чтобы последние числа не игнорировались? Подрограмма написана в среде PascalABC.NET]]></description>
        <author>Alexandrietz</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	