Консультация # 196466: Здравствуйте! Прошу помощи в следующем вопросе: Реализовать алгоритм сортировки прямым слиянием. Размер массива задаёт пользователь. Вывести на экран исходный и отсортированный массивы. PascalABC ...Консультация # 196467: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Разработать алгоритм сортировки естественным слиянием. Отсортировать с помощью него массив. pascal ...
program SortSlian;
uses crt;
type mas=array[1..1000] of integer;
procedure Sliv(var a:mas;p,q : integer);
{процедура сливающая массивы, p-начало, q-конец}
var r,i,j,k : integer;
b:mas;
begin
r:=(p+q) div 2;{делим массив}
i:=p;{начало левой половины}
j:=r+1;{начало правой половины}
for k:=p to q do{смотрим от начала до конца}
if (i<=r) and ((j>q) or (a[i]<a[j])) then
{переставляем элементы из половин в новый массив, упорядочивая пары}
begin
b[k]:=a[i];
i:=i+1;
end
else
begin
b[k]:=a[j];
j:=j+1;
end ;
for k:=p to q do
a[k]:=b[k];
end;
{рекурсивная процедура сортировки, проверяет если осталось
больше одного элемента, повторяет слияние в левой или правой частях массива}
procedure Sort(var a:mas;p,q : integer); {p,q - индексы начала и конца сортируемой части массива}
begin
if p<q then {массив из одного элемента тривиально упорядочен}
begin
Sort(a,p,(p+q) div 2);{сортируем левую половину}
Sort(a,(p+q) div 2 + 1,q);{правую половину}
Sliv(a,p,q);{сливаем две половины}
end;
end;
var a:mas;
n,i:integer;
begin
clrscr;
randomize;
write('Размер массива n=');
readln(n); {Определение размера массива A - N) и его заполнение}
writeln('Исходный массив:');
for i:=1 to n do
begin
a[i]:=random(50);
write(a[i],' ');
end;
writeln;
writeln;
{запуск сортирующей процедуры, сортируем от первого до последнего элемента}
Sort(a,1,N);
{Вывод отсортированного массива A}
writeln('Результат сортировки:');
for i:=1 to n do
write(a[i],' ');
readln
end.
Консультировал: zdwork (5-й класс)
Дата отправки: 27.09.2019, 11:53
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;{рабочие переменные}
c,c0,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]);
c:=FileSize(f0);
close(f0);
c0:=1;
while c0<c do
begin
reset(f0);rewrite(f1);rewrite(f2);
writeln('range:',c0:3,':');
c1:=0;
while(not EOF(f0))and(c1<(c div 2))do begin read(f0,a1);write(f1,a1);inc(c1)end;
while not EOF(f0)do begin read(f0,a1);write(f2,a1)end;
close(f0);close(f1);close(f2);
writeln('control output before sort:');
reset(f0);reset(f1);reset(f2);
while not EOF(f0)do begin read(f0,a1);write(a1:3)end;writeln;
while not EOF(f1)do begin read(f1,a1);write(a1:3)end;writeln;
while not EOF(f2)do begin read(f2,a1);write(a1:3)end;writeln;
close(f0);close(f1);close(f2);
rewrite(f0);reset(f1);reset(f2);
while(not EOF(f1))and(not EOF(f2)) do
begin
c1:=c0;c2:=c0;
read(f1,a1);read(f2,a2);
while(c1>0)and(c2>0)do
begin
if a1<=a2 then begin write(f0,a1);dec(c1);if c1>0 then read(f1,a1)end
else begin write(f0,a2);dec(c2);if c2>0 then read(f2,a2)end;
end;
if c1>0then begin while(c1>1)and(not EOF(f1))do begin write(f0,a1);read(f1,a1);dec(c1)end;write(f0,a1)end;
if c2>0then begin while(c2>1)and(not EOF(f2))do begin write(f0,a2);read(f2,a2);dec(c2)end;write(f0,a2)end;
end;
close(f0);close(f1);close(f2);
writeln('control output after sort:');
reset(f0);
while not EOF(f0) do begin read(f0,a1);write(a1:3)end;writeln;
close(f0);
c0:=c0*2;
end;
end.
Котрольный массив затдан в соответсвии с GIF в минифоруме, для контроля. Получается такой протокол:
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.
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!