Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.12.2011, 21:21
zabludshiy zabludshiy вне форума
Прохожий
 
Регистрация: 28.12.2011
Сообщения: 3
Репутация: 10
По умолчанию алгоритм Шелла для 100000 элементов

Необходимо сделать сортировку массива из 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}
Помогите, пожалуйста, разобраться, почему программа не отрабатывает для 100000 элементов (ошибка: Exception EAccessViolation in module Laba3.exe at 00008c2a
Access violation at address 00408c2a in module 'laba3.exe'. Write of address 017c9c50)?
Программа делалась на делфи 7, в виде консольного приложения винды. Полный текст проги прилагается. Буду благодарен за любую помощь, так как самому разобраться не получается в виду малого опыта в программировании.
Вложения
Тип файла: 7z sort.7z (2.5 Кбайт, 3 просмотров)
Ответить с цитированием
  #2  
Старый 28.12.2011, 21:42
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Всё просто, не используй локальный буфер (идёт переполнение стека), а вынеси в глобальные переменные.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 28.12.2011, 22:20
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да не, тут проще все. У тебя массив 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  
Старый 28.12.2011, 23:46
zabludshiy zabludshiy вне форума
Прохожий
 
Регистрация: 28.12.2011
Сообщения: 3
Репутация: 10
По умолчанию

Видимо я не догоняю элементарных вещей..
Сортируемый массив, на котором бьет ошибку, равен 100000, в этом случае запись (len-1) div 3 , где len =100000, равна 33333. В проге я беру с запасом массив h:array[1..40000] of integer. Подскажите, пожалуйста, что не так с массивом h???
Ответить с цитированием
  #5  
Старый 28.12.2011, 23:51
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вынеси массив в глобальную переменную.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 29.12.2011, 00:49
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

s, которая выступает в качестве индекса получает значение -65534, а индексация массива начинается от -40000

Код:
 s := s + 1;
 data[s] := x;
Ответить с цитированием
Этот пользователь сказал Спасибо ART за это полезное сообщение:
zabludshiy (31.12.2011)
  #7  
Старый 29.12.2011, 08:43
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

http://ru.wikibooks.org/wiki/Категор...тмы_сортировки
Ответить с цитированием
  #8  
Старый 29.12.2011, 19:43
U.B.M. U.B.M. вне форума
Новичок
 
Регистрация: 06.10.2011
Сообщения: 94
Версия Delphi: Delphi 7
Репутация: 13
По умолчанию

По поводу возможного переполнения стэка (мало ли вдруг будут проблемы) - можно посмотреть тут
Ответить с цитированием
  #9  
Старый 31.12.2011, 08:43
zabludshiy zabludshiy вне форума
Прохожий
 
Регистрация: 28.12.2011
Сообщения: 3
Репутация: 10
Хорошо

Всем откликнувшимся спасибо. Отдельное Спасибо ART. Ошибка была именно в неправильно подобранном диапазоне индексов.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:37.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025