Помощь - Поиск - Пользователи - Календарь
Полная версия: сортировка Шелла
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Triplet
Подскажите, пожалуйста, в чем ошибка?
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
Я бы на твоем месте все-таки не вычитал содержимое переменной типа Integer из содержимого переменной типа Index (имеющего меньший диапазон), да еще и занося результат в Index вот тут:
y:=x[i];
j:=i-h; { <--- }

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

P.S. Должно быть достаточно поменять только тип переменной J...
Triplet
volvo, спасибо огромное! Все заработало.
А если я буду менять шаг в программе, надо менять только вот эту строчку h:=2*h+1, например, h:=3*h+1?
volvo
Нужно будет еще добавить условие - до каких пор, собственно, изменять шаг...
Triplet
Спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.