Консультация № 196680
15.10.2019, 08:13
0.00 руб.
15.10.2019, 10:34
0 2 1
Здравствуйте! Прошу помощи в следующем вопросе:

Разработать алгоритм сортировки естественным слиянием. Отсортировать с помощью него
массив.

Pascal

Приложение:
Pascal

Обсуждение

давно
Старший Модератор
31795
6196
15.10.2019, 11:19
общий
Адресаты:
Тут смотрели?
Цитата: rail
сортировки естественным слиянием.

Сортировка естесвенным слиянием, так же как простым(прямым) слияниям - относится к внешним сортировкам, по этому массив при сортировке не используется, вместо него используются файлы.

Массивы используются только во внутренних сортировках, а это две большие разницы.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
19.10.2019, 19:28
общий
это ответ
Здравствуйте, rail!

Цитата: Интуит
К наиболее известным алгоритмам внешних сортировок относятся:

сортировки слиянием (простое слияние и естественное слияние);
улучшенные сортировки (многофазная сортировка и каскадная сортировка).


Код в приложении:
[code lang=pascal h=300]const
n0:string='inpData.dat';
n1:string='File1st.dat';
n2:string='File2nd.dat';
a:array[1..16]of integer=(59,30,99,28,27,87,65,98,25,29,92,88,73,84,81,41);
type
tF=file of integer;
var
f0,f1,f2:tF;{}
a1,a2:integer;{}
b:boolean;
c1,c2:integer;{}
begin
assign(f0,n0);assign(f1,n1);assign(f2,n2);
rewrite(f0);
for c1:=1 to 16 do write(f0,a[c1]);
close(f0);
repeat
reset(f0);rewrite(f1);rewrite(f2);
read(f0,a1,a2);b:=true;
repeat
if b then write(f1,a1) else write(f2,a1);
if a1>a2 then b:= not b;
a1:=a2;
read(f0,a2);
until EOF(f0);
if b then write(f1,a1) else write(f2,a1);
if a1>a2 then b:=not b;
if b then write(f1,a2) else write(f2,a2);
close(f0);close(f1);close(f2);
{}
writeln('control output before sort:');
reset(f0);reset(f1);reset(f2);
write(FileSize(f0):6,' ':3);while not EOF(f0)do begin read(f0,a1);write(a1:3)end;writeln;
write(FileSize(f1):6,' ':3);while not EOF(f1)do begin read(f1,a1);write(a1:3)end;writeln;
write(FileSize(f2):6,' ':3);while not EOF(f2)do begin read(f2,a1);write(a1:3)end;writeln;
c1:=FileSize(f1);c2:=FileSize(f2);
close(f0);close(f1);close(f2);
if(c1<>0)and(c2<>0)then
begin
rewrite(f0);reset(f1);reset(f2);
while(not EOF(f1))and(not EOF(f2))do
begin
c1:=-32768;c2:=-32768;
read(f1,a1);read(f2,a2);
while(c1<=a1)and(c2<=a2)and(not EOF(f1))and(not EOF(f2))do
if a1<=a2 then
begin
write(f0,a1);
c1:=a1;
read(f1,a1)
end
else
begin
write(f0,a2);
c2:=a2;
read(f2,a2)
end;
while(c1<=a1)and(not EOF(f1))do
begin
write(f0,a1);
c1:=a1;
read(f1,a1)
end;
while(c2<=a2)and(not EOF(f2))do
begin
write(f0,a2);
c2:=a2;
read(f2,a2)
end;
while not EOF(f1)do
begin
write(f0,a1);
read(f1,a1)
end;
while not EOF(f2)do
begin
write(f0,a2);
read(f2,a2)
end;
if a1<=a2 then write(f0,a1,a2)
else write(f0,a2,a1);
end;
close(f0);close(f1);close(f2);
reset(f0);reset(f1);reset(f2);
writeln('control output after sort');
write(FileSize(f0):6,' ':3);while not EOF(f0)do begin read(f0,a1);write(a1:3)end;writeln;
write(FileSize(f1):6,' ':3);while not EOF(f1)do begin read(f1,a1);write(a1:3)end;writeln;
write(FileSize(f2):6,' ':3);while not EOF(f2)do begin read(f2,a1);write(a1:3)end;writeln;
c1:=FileSize(f1);c2:=FileSize(f2);
close(f0);close(f1);close(f2);
end
until(c1=0)or(c2=0);
end.[/code]
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа