Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Помогите найти ошибку в коде, алгоритм пирамидальной сортировки  
V
    Опции темы
kostyaizznu
Дата 25.12.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 30.10.2008
Где: Запорожье

Репутация: нет
Всего: нет



я запрограммировал алгоритм пирамидальной сортировки. Алгоритм на 100% верен, т.к он из надёжного источника, алгоритм оформил в  процедуру. Но при выполнении выскакивает "Stack is overflow error"

Что делать???
  


Код

program  lab_Derevo;
uses crt,windos;

type mt=record
          num:integer;
          mas:string[20];
  end;


var
    n,i,j,l,r:integer;
    f1,f2:text;
    a:array[1..1705] of mt;
    num:integer;
    s:string;
Procedure heap(n:integer;a:array of mt);
 var
     i,j,r,l:integer;
     s:string;
     label lend,H2,H4,H5,H6,H8;

Begin
{H1.   Nachalnye ustanovki}

    l:=(n div 2) + 1;
    r:=n;

{H2.   Umenshyt' l ili r}  H2:

    if (l>1) then begin
        l:=l-1; s:=a[l].mas;  num:=a[l].num;

    end
    else begin
     s:=a[r].mas; num:=a[r].num; a[r].mas:=a[l].mas; r:=r-1;
       if (r=1) then begin
                     a[l].mas:=s;
                     goto lend;
                     end;
    end;
{H3.   Prigotovit'sya k protaskivaniyu}
   j:=l;
{H4,   Prodvinut'sya vniz}  H4:
   i:=j; j:=2*j;
   if (j<r) then goto H5;
   if (j=r) then goto H6;
   if (j>r) then goto H8;
{H5.    Nayti bolshego syna}   H5:
   if (a[j].mas<a[j+1].mas) then j:=j+1;
{H6.   Bol'she K?} H6:
   if (s>=a[j].mas) then goto H8;
{H7.   Podnyat' ego vverh}
   a[i].mas:=a[j].mas; goto H4;
{H8.   Zanesti R} H8:
   a[i].mas:=s; goto H2;


lend:

end;

BEGIN
clrscr;
  assign (f1,'in.txt');
  reset (f1);
 i:=0;
    While not EOF(f1) do begin
       readln(f1,s);
       a[i].mas:=s;
       a[i].num:=i;
       inc(i);
     end;
 n:=i;
  assign(f2,'out.txt');
  rewrite(f2);

 HEAP(n,a);


for i:=1 to n do begin
  writeln(f2,a[i].mas,'  ',a[i].num);

end;




readln;
END.


Добавлено @ 19:39
Вот Алгоритм 

Выражение  [[ x ]] значит что берём нижнюю целую часть от х.

Алгоритм Н. (Пирамидальная  сортировка.) Записи R1, ..., RN переразмещаются на том же
месте; после завершения сортировки их ключи будут упорядочены: K1  ≤ ... ≤ KN. Сначала
файл перестраивается в пирамиду, после чего вершина пирамиды многократно исключается
и записывается на свое окончательное место. Предполагается, что N ≥ 2.
H1. [Начальная установка.] Установить l ← [[N/ 2]]+ 1, r!N.
Н2. [Уменьшить l или r.] Если l  > 1, то установить l ! l-1, R ! Rl,  K ! Kl (Если l  >1,
это означает, что происходит процесс преобразования исходного файла в пирамиду;
если же l  =  1, то это значит, что ключи K1, K2, ..., Kr уже образуют пирамиду.)
В противном случае установить R ! Rr, K ! Kr, Rr ! R1, r! r - 1; если в результате
оказалось, что r = 1, то установить R1 ! R и завершить работу алгоритма.
Н3. [Приготовиться к "протаскиванию".] Установить j ! l. (К этому моменту
 j  j K ≥ K / 2 при l < [[j / 2]] < j ≤ r , (4)
а записи Rk, r  < k  ≤  N, занимают свои окончательные места. Шаги Н3 — Н8
называются алгоритмом "протаскивания"; их действие эквивалентно установке Rl ! R
с последующим перемещением записей Rl, ..., Rr таким образом, чтобы условие (4)
выполнялось и при [[j / 2]] = l .)
Н4. [Продвинуться вниз.] Установить i ! j и j ← 2j. (В последующих шагах i = [[j / 2]].)
Если j  < r, то перейти к шагу Н5; .если j  = r, то перейти к шагу Н6; если же j  > r,
то перейти к шагу Н8.
Н5. [Найти "большего" сына.] Если Kj < Kj+1, то установить j ← j+1.
Н6. [Больше K?] Если К ≥ Кj, то перейти к шагу Н8.
Н7. [Поднять его вверх.] Установить Ri ← Rj  и возвратиться к шагу Н4.
Н8. [Занести R.] Установить Ri  ←  R. (На этом алгоритм "протаскивания", начатый
в шаге НЗ, заканчивается.) Возвратиться к шагу Н2.

Это сообщение отредактировал(а) kostyaizznu - 25.12.2008, 19:40
PM MAIL ICQ Skype   Вверх
Dobermann
Дата 25.12.2008, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



о_О вот твой единомышленник, с точно таким же кодом!!!
http://forum.vingrad.ru/forum/topic-241766.html
PM   Вверх
volvo877
Дата 26.12.2008, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Закрыть... Все вопросы - в той теме...
PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.