Внешняя сортировка(естественное и прямое слияния)
Задача: Разработать программу для сортировки текстового файла, используя сортировку прямым слиянием и естественным слиянием. Измерить время, требуемое для сортировки файла разными способами. Подпрограммы сортировки реализовать в отдельном модуле.
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, равное единице, но даже тут неведомое творится. Помогите, эксперты. В дополнение ко всему этому очень часто возникает ошибка о том, что я вышёл за пределы файла, и считать ничего нельзя.