Консультация № 196466
27.09.2019, 10:01
0.00 руб.
0 3 2
Здравствуйте! Прошу помощи в следующем вопросе:

Реализовать алгоритм сортировки прямым слиянием. Размер массива задаёт пользователь.
Вывести на экран исходный и отсортированный массивы.

PascalABC


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

Обсуждение

давно
Студент
402651
154
27.09.2019, 11:53
общий
27.09.2019, 12:06
это ответ
Здравствуйте, Satana666!
Попробуйте ТАК...

[code lang=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.[/code]
давно
Старший Модератор
31795
6196
27.09.2019, 22:04
общий
Адресаты:
b 59 30 99 28 27 87 65 98 25 29 92 88 73 84 81 41
b 59 30 99 28 27 87 65 98
b 59 30 99 28
b 59 30
a 30 59
b 99 28
a 28 99
a 28 30 59 99
b 27 87 65 98
b 27 87
a 27 87
b 65 98
a 65 98
a 27 65 87 98
a 27 28 30 59 65 87 98 99
b 25 29 92 88 73 84 81 41
b 25 29 92 88
b 25 29
a 25 29
b 92 88
a 88 92
a 25 29 88 92
b 73 84 81 41
b 73 84
a 73 84
b 81 41
a 41 81
a 41 73 81 84
a 25 29 41 73 81 84 88 92
a 25 27 28 29 30 41 59 65 73 81 84 87 88 92 98 99

Это работа Ващей программы:
А это

то, как он должен работать, см. тут Сортировка прямым слиянием Боуза-Нельсона.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
01.10.2019, 16:06
общий
это ответ
Здравствуйте, Satana666!

Правильный код:внешней сортировки-прямым слиянием.
[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;{рабочие переменные}
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.[/code]
Котрольный массив затдан в соответсвии с GIF в минифоруме, для контроля.
Получается такой протокол:
range: 1:
control output before sort:
59 30 99 28 27 87 65 98 25 29 92 88 73 84 81 41
59 30 99 28 27 87 65 98
25 29 92 88 73 84 81 41
control output after sort:
25 59 29 30 92 99 28 88 27 73 84 87 65 81 41 98
range: 2:
control output before sort:
25 59 29 30 92 99 28 88 27 73 84 87 65 81 41 98
25 59 29 30 92 99 28 88
27 73 84 87 65 81 41 98
control output after sort:
25 27 59 73 29 30 84 87 65 81 92 99 28 41 88 98
range: 4:
control output before sort:
25 27 59 73 29 30 84 87 65 81 92 99 28 41 88 98
25 27 59 73 29 30 84 87
65 81 92 99 28 41 88 98
control output after sort:
25 27 59 65 73 81 92 99 28 29 30 41 84 87 88 98
range: 8:
control output before sort:
25 27 59 65 73 81 92 99 28 29 30 41 84 87 88 98
25 27 59 65 73 81 92 99
28 29 30 41 84 87 88 98
control output after sort:
25 27 28 29 30 41 59 65 73 81 84 87 88 92 98 99

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа