![]() |
|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
![]() Всё просто, не используй локальный буфер (идёт переполнение стека), а вынеси в глобальные переменные.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#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
|
||||
|
||||
![]() Вынеси массив в глобальную переменную.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
|||
|
|||
![]() s, которая выступает в качестве индекса получает значение -65534, а индексация массива начинается от -40000
Код:
s := s + 1; data[s] := x; |
Этот пользователь сказал Спасибо ART за это полезное сообщение: | ||
zabludshiy (31.12.2011)
|
#7
|
|||
|
|||
![]() |
#9
|
|||
|
|||
![]() Всем откликнувшимся спасибо. Отдельное Спасибо ART. Ошибка была именно в неправильно подобранном диапазоне индексов.
![]() |