Лабораторные работы_2 / Спецификации / Лабораторная работа 6
.docЛабораторная работа № 6
«Внешняя сортировка»
Захаров Антон
группа А–13–08
-
Условие задачи.
Программу NaturalMerge перевести в Турбо Паскаль, сделав ее работоспособной в Турбо среде:
- избавиться от буферной переменной, реализуя “заглядывание вперед”;
- задать внешние имена для файлов;
Исправить некорректность программы, вызванную принятым Допущением.
-
Входные данные.
Входная форма:
fin
<key> <key>…<key> |
конец файла
-
Выходные данные.
{Пересылка элемента из х в y}
procedure Copy (var x,y:tape);
var buf:item;
begin
read(x,buf);
write(y,buf);
if eof(x) then
eor:=true
else {Заглядывание вперед}
eor:=buf.key > x^.key;
end;
{Перепись одной серии из x в y}
procedure CopyRun (var x,y:tape);
begin
repeat
Copy (x,y)
until eof;
end;
{из с в а и в}
procedure Distribute;
begin
repeat
Copyrun (c,a);
if not eof (c) then
Copyrun (c,b)
until eof(c);
end;
{Слияние серий из а и b в с}
procedure MergeRun;
begin
repeat
if a^.key<b^.key then
begin
Copy (a,c);
if eof then
CopyRun (b,c)
end
else
begin
Copy(b,c);
if eor then
CopyRun(a,c)
end
until eof;
end;
{ из а и в в с .}
procedure Merge;
begin
repeat
MergeRun;
l:=l+1;
until not eof(a);
if not eof(a) then
begin
CopyRun(a,c);
l:=l+1;
end
end;
{Сортировка естественным слиянием}
procedure NaturalMerge;
var l : integer; {Количество серий}
a, b : tape;
begin .
repeat
rewrite (a);
rewrite (b);
reset (c);
Distribute; {распределение}
l:=0;
Merge; {слияние}
until l=1;
end;