Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ сортировка Шелла

Автор: Triplet 25.05.2008 12:48

Подскажите, пожалуйста, в чем ошибка?

program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;
Type TBase=record
Key:integer;
end;
Index=1..20000;
Vector=array[Index] of TBase;

Function Shell(var x:vector;n:integer):vector;
Var t,m,h:integer;
i,j:index;
y:TBase;
begin
t:=round(ln(n)/ln(2))-1;
for m:=t downto 1 do
begin
h:=0;
for i:=1 to m do h:=2*h+1; //h - шаг сортировки
for i:=h+1 to N do
begin
y:=x[i];j:=i-h;
while (j>=1) and (y.key<x[j].Key) do
begin
x[j+h]:=x[j];
j:=j-h;
end;
x[j+h]:=y;
end;
end;
Shell:=x;
end;


Var z,n:integer;x,qwer:vector;
begin
n:=10; //кол-во элементов массива
Randomize;
for z:=1 to n do
begin
x[z].key:=Random(20);
Writeln(x[z].key);
end;
qwer:=Shell(x,n);
Writeln;
for z:=1 to n do
Writeln(qwer[z].key);
Readln;
end.




Иногда программа работает исправно, а иногда вылетает на строче x[j+h]:=y; в функции unsure.gif
Заранее спасибо

Автор: volvo 25.05.2008 13:11

Я бы на твоем месте все-таки не вычитал содержимое переменной типа Integer из содержимого переменной типа Index (имеющего меньший диапазон), да еще и занося результат в Index вот тут:

y:=x[i];
j:=i-h; { <--- }

Поменяй типы I и J на Integer, все должно нормализоваться...

P.S. Должно быть достаточно поменять только тип переменной J...

Автор: Triplet 25.05.2008 13:27

volvo, спасибо огромное! Все заработало.
А если я буду менять шаг в программе, надо менять только вот эту строчку h:=2*h+1, например, h:=3*h+1?

Автор: volvo 25.05.2008 14:15

Нужно будет еще добавить условие - до каких пор, собственно, изменять шаг...

Автор: Triplet 25.05.2008 14:37

Спасибо!