Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Сортировка попарным слиянием


Автор: radist 22.4.2007, 17:02
Помогите откомпилировать программу. Почему-то не выводит отсортированный массив.
Код

Program _3_4;
uses crt;
Type massiv = array [1..15] of integer;
var
i0,j0,i,j,si,sj,k,ke,m,t:integer;
a: massiv;
begin
clrscr;
Writeln ('                         Cортировка по парныим слиянием');
Writeln;
for i := 1 to 15 do a[i]:= random(15);
Writeln ('Массив случайных чисел:');
for i:=1 to 15 do write (a[i]:3); {заполнение массива случайными числами}
Writeln; Writeln;

begin       {сортировка по парным слиянием}
  si:=1;    {начальный размер одного множества}
  while si<15 do {цикл, пока одно множество не составит весь массив}
   begin
     i0:=1;  {начальный индекс 1-ого множества пары}
     while i0<15 do  {цикл, пока не пересмотрим весь массив}
      begin
      j0:=i0+si;  {начальный индекс 2-ого множества пары}
      i:=i0;
      j:=j0;
   {размер 2-ого множества пары может ограничиваться концом массива}
 if si>15-j0+1 then sj:=15-j0+1 else sj:=si;
 if sj>0 then
   begin
     k:=i0; {начальный индекс слитого множества}
     while (i<i0+si+sj) and (j<j0+sj) do  {цикл, пока не исчерпаются
 оба входные множества}
     begin
 if a[i]>a[j] then {если элемент 1-ого <= элемента 2-ого, он остается на
 своём месте, но выходное множество расширяется иначе - освобождается место
 в выходном множестве и туда заносится элемент второго множества}
   begin
     t:=a[j];
     for m:=j-1 downto k do a[m+1]:=a[m];
     a[k]:=t;
     j:=j+1; {к следуещиму элементу во 2-м множестве}
    end; { if a[i] > a[j] }
     k:=k+1;   {выходное множество увеличелось}
     i:=i+1;   {если был перенос - за счет сдвига, если не было - за счет
     перехода элемента в выходное множество}
    end; {while}
    end; {if sj>0}
     i0:=i0+si*2; {начало следующей пары}
    end; {while i0<15}
     si:=si*2; {размер элементов пары увеличивается вдвое}
    end; {while si<15}
    end;
    for i:=1 to 15 do write (a[i]:3);
    Writeln (a[j]);
    readln;
    end.

Заранее благодарен!

Автор: lamerOK 22.4.2007, 17:56
У меня Pascal ABC компелирует, но при компиляции иногда выходит следующие 'Ошибка: 16 - выход за границы диапазона изменения индекса 1..15 (Program5.pas, строка 54)' А так программа написана правильно smile    

Автор: Misha_White 18.5.2007, 18:17
lamerOK, 
Цитата(lamerOK @  23.4.2007,  00:56 Найти цитируемый пост)
А так программа написана правильно 

Код

 for i:=1 to 15 do write (a[i]:3);
    Writeln (a[j]);

Это мы называем правильно написано?! smile 
А чему же у вас тут j равно?!
где цикл?!


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)