21.10.2019, 02:02 [+3 UTC]
в нашей команде: 3 890 чел. | участники онлайн: 2 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.77 (31.05.2019)
JS-v.1.34 | CSS-v.3.35

Общие новости:
28.04.2019, 09:13

Форум:
11.10.2019, 14:47

Последний вопрос:
21.10.2019, 00:06
Всего: 150654

Последний ответ:
20.10.2019, 20:38
Всего: 259251

Последняя рассылка:
20.10.2019, 19:45

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
30.05.2011, 16:54 »
lamed
Большое спасибо, Роман. Все "по полочкам". С уважением [вопрос № 183419, ответ № 267462]
08.12.2010, 20:09 »
novij2011
спасибо за помощь [вопрос № 181114, ответ № 264596]
Наши встречи:
ID: 893

РАЗДЕЛ • Pascal / Delphi / Lazarus

Создание программ на языках Pascal, Delphi и Lazarus.

[администратор рассылки: Зенченко Константин Николаевич (Старший модератор)]

Лучшие эксперты в этом разделе

zdwork
Статус: 6-й класс
Рейтинг: 858
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 238
puporev
Статус: Профессионал
Рейтинг: 79

Перейти к консультации №:
 

Консультация онлайн # 196466
Раздел: • Pascal / Delphi / Lazarus
Автор вопроса: Satana666 (1-й класс)
Отправлена: 27.09.2019, 10:01
Поступило ответов: 2

Здравствуйте! Прошу помощи в следующем вопросе:

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

PascalABC
smile

Приложение:

Состояние: Консультация закрыта

Ответ # 278779 от zdwork (6-й класс)

Здравствуйте, Satana666!
Попробуйте ТАК...

Код (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.

Последнее редактирование 27.09.2019, 12:06 Зенченко Константин Николаевич (Старший модератор)

Консультировал: zdwork (6-й класс)
Дата отправки: 27.09.2019, 11:53

Рейтинг ответа:

+1

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Здравствуйте, Satana666!

Правильный код:внешней сортировки-прямым слиянием.

Код (Pascal) :: выделить код
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 в минифоруме, для контроля.
Получается такой протокол:
© Цитата:
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

Удачи!


Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 01.10.2019, 16:06

Рейтинг ответа:

+1

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 196466

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 1

= общий = | 27.09.2019, 22:04 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
zdwork:

© Цитата:
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

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

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

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.15347 сек.

© 2001-2019, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.77 от 31.05.2019
Версия JS: 1.34 | Версия CSS: 3.35