![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Необходимо сделать сортировку массива из 100, 1000, 10000, 100000 элементов алгоритмами бинарных вставок и шелла. Бинарные вставки получилось реализовать, а вот алгоритм Шелла, по непонятным мне причинам, на 100000 перестает работать и выкидывает из проги, хотя для 100-10000 элементов отрабатывает "на ура".
Процедура алгоритма Шелла: Код:
procedure ShellSort(var pArr :PSortArrType; var result :ResultType);
var
i, j,m,k,s,x :Integer;
tmp :Integer;
start : Real;
h:array[1..40000] of integer;
begin
Writeln('ShellSort: Array size = ', pArr^.len);
start := GetMilliSeconds;
with pArr^, result do begin
m:=1;
h[1]:=1;
while h[m]<((len-1) div 3) do
begin
h[m+1]:=2*h[m]+1;
m:=m+1;
end;
tmp:=m;
for m:=tmp downto 1 do
begin
k:=h[m]; s:=-k;
for i:=k+1 to len do
begin
x:=data[i]; j:=i-k;
if s=0 then s:=-k;
s:=s+1; data[s]:=x;
Inc(comps);
while x<data[j] do
begin
data[j+k]:=data[j]; j:=j-k;
Inc(comps);
Inc(moves);
end;
data[j+k]:=x; Inc(moves);
end
end
end;
//Inc(moves);
//Inc(comps);
result.time := GetMilliSeconds - start;
end; {ShellSort}Access violation at address 00408c2a in module 'laba3.exe'. Write of address 017c9c50)? Программа делалась на делфи 7, в виде консольного приложения винды. Полный текст проги прилагается. Буду благодарен за любую помощь, так как самому разобраться не получается в виду малого опыта в программировании. |
|
#2
|
||||
|
||||
|
Всё просто, не используй локальный буфер (идёт переполнение стека), а вынеси в глобальные переменные.
|
|
#3
|
|||
|
|||
|
Да не, тут проще все. У тебя массив h какой длинны? А сортируемый массив какой длинны? А теперь внимательно посмотри на вот этот кусок кода:
Код:
h[1]:=1;
while h[m]<((len-1) div 3) do
begin
h[m+1]:=2*h[m]+1;
m:=m+1;
end;ЗЫ. При переполнении стека происходит другой эксепшн. |
|
#4
|
|||
|
|||
|
Видимо я не догоняю элементарных вещей..
Сортируемый массив, на котором бьет ошибку, равен 100000, в этом случае запись (len-1) div 3 , где len =100000, равна 33333. В проге я беру с запасом массив h:array[1..40000] of integer. Подскажите, пожалуйста, что не так с массивом h??? |
|
#5
|
||||
|
||||
|
Вынеси массив в глобальную переменную.
|
|
#6
|
|||
|
|||
|
s, которая выступает в качестве индекса получает значение -65534, а индексация массива начинается от -40000
Код:
s := s + 1; data[s] := x; |
| Этот пользователь сказал Спасибо ART за это полезное сообщение: | ||
zabludshiy (31.12.2011)
| ||
|
#7
|
|||
|
|||
|
|
|
#9
|
|||
|
|||
|
Всем откликнувшимся спасибо. Отдельное Спасибо ART. Ошибка была именно в неправильно подобранном диапазоне индексов.
![]() |