1 / 1 / 0
Регистрация: 25.09.2014
Сообщений: 125
1

Сортировка методом Хоара, исправить ошибку (переполнение стека, бесконечный цикл)

16.03.2015, 19:20. Показов 1877. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сортировка методом Хоара.
Нужно первую четверть рассортировать по убыванию, а всё остальное - по возрастанию.
Сделал две процедуры сортировки соответственно потребованному.
Но вот проблема: процедура сортировки по возрастанию(hsv) работает, а процедура сортировки по убыванию(hsu) - не работает.
В Turbo Pascal 7.1 выдаёт ошибку "Stack overflow error"(переполнение стека), а в Free Pascal просто зацикливается на месте. Собственно, я вижу что проблема в процедуре сортировки по убыванию, а вот где именно она и как её решить - не вижу.

Просветите, почему не работает.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Program HoareSort;
uses    crt;
const   n=20;
var     a:array[1..n] of integer;
        i,ch:integer;
 
 
Procedure hsu(LL,RR:integer);
var       ii,jj,bb,tt:integer;
Begin
bb:=a[(LL+RR) div 2];
ii:=LL; jj:=RR;
while ii<=jj do
Begin
while a[ii]<bb do ii:=ii+1;
while a[jj]>bb do jj:=jj-1;
if ii>=jj then
Begin
tt:=a[ii];
a[ii]:=a[jj];
a[jj]:=tt;
ii:=ii+1;
jj:=jj-1;
End;
End;
if LL<jj then
hsu(ll,jj);
if ii<rr then
hsu(ii,rr);
End;
 
Procedure hsv(L,R:integer);
var       i,j,b,t:integer;
Begin
b:=a[(L+R) div 2];
i:=L; j:=R;
while i<=j do
Begin
while a[i]<b do i:=i+1;
while a[j]>b do j:=j-1;
if i<=j then
Begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
i:=i+1;
j:=j-1;
End;
End;
if L<j then
hsv(l,j);
if i<r then
hsv(i,r);
End;
 
Begin
clrscr;
write('What array you want? |1 - random | 0 - users|: ');
readln(ch);
if ch=0 then
Begin
for i:=1 to n do
Begin
write('Enter a[',i,']: ');
readln(a[i]);
End;
End else if ch=1 then
Begin
for i:=1 to n do
a[i]:=random(99);
End;
writeln;
writeln('Initial array: ');
for i:=1 to n do
write(a[i]:3);
writeln;
 
hsu(1,n div 4);
hsv((n div 4)+1, n);
 
writeln;
writeln('Hoare-Sorted array: ');
for i:=1 to n do
write(a[i]:3);
readln;
End.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2015, 19:20
Ответы с готовыми решениями:

Бесконечный цикл: найти и исправить ошибку в коде
Есть такой код, если вводишь цифру меньше 4 или больше 40 всё хорошо, он просто очищает консоль и...

Быстрая сортировка. Переполнение стека
Написал программу быстрой сортировки происходит переполнение стека, при большом количестве...

Сортировка подсчетом и переполнение стека
Все здравствуйте, мне необходимо выполнить сортировку подсчетом, но вот проблема - переполнение...

Сортировка двумерного массива (переполнение стека, что делать?)
Вообщем есть такое задание Составить программу сортировки двумерного квадратного массива по...

7
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
16.03.2015, 20:49 2
Сортировка методом Хоара
0
1 / 1 / 0
Регистрация: 25.09.2014
Сообщений: 125
16.03.2015, 21:09  [ТС] 3
Собственно, с методом сортировки я знаком.
Переделал под тот вид, результат - то же.
0
1 / 1 / 0
Регистрация: 25.09.2014
Сообщений: 125
25.03.2015, 23:53  [ТС] 4
Выходит, что нужно всего-то знаки изменить в неработающей процедуре, менял все, менял по-разному, результат тот же - зацикливается на месте(на другом ПК "stack overflow").

P.S.:Тема всё ещё актуальна.
0
228 / 225 / 220
Регистрация: 03.07.2012
Сообщений: 466
26.03.2015, 04:19 5
17-ая строка:
Pascal
1
if ii<=jj then
0
1 / 1 / 0
Регистрация: 25.09.2014
Сообщений: 125
26.03.2015, 17:34  [ТС] 6
Так работает, но не так как нужно.
Оно первую четверть сортирует по возрастанию и все остальные по возрастанию.
А мне нужно первую четверть по убыванию.

Добавлено через 13 минут
Вот когда я и меняю знак на противоположный, тогда и зацикливается.
0
228 / 225 / 220
Регистрация: 03.07.2012
Сообщений: 466
27.03.2015, 03:43 7
Лучший ответ Сообщение было отмечено Magestian как решение

Решение

15,16-ые строки:
Pascal
1
2
while a[ii]>bb do ii:=ii+1;
while a[jj]<bb do jj:=jj-1;
1
1 / 1 / 0
Регистрация: 25.09.2014
Сообщений: 125
27.03.2015, 16:45  [ТС] 8
То, что нужно! Благодарю.
Я эти знаки тоже менял, но не только их, вот, наверное, и по-этому не работало.
0
27.03.2015, 16:45
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.03.2015, 16:45
Помогаю со студенческими работами здесь

Исправить бесконечный цикл
Почему то тут бесконечный цикл. Не могу понять в чем проблема, visual studio попросту зависает при...

Сортировка методом Хоара
Ввести массив x1,x2,...,x20 в диапазоне . Требуется расположить отрицательные элементы в порядке...

Сортировка методом Хоара
Здравствуйте , прошу помочь разобраться с сортировкой хоара. вот код из книги ( а не из инета с...

Сортировка методом Хоара
Дали задание 1. Пусть дано массив a1, a2, ..., an. Необходимо переставить его элементы так, чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
Распознавание изображений (компьютерное зрение) на C++
InfoMaster 20.01.2025
Введение в компьютерное зрение и основы работы с изображениями Компьютерное зрение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, позволяющую. . .
Какой язык программировани­я лучший для разработки нейронных сетей
InfoMaster 20.01.2025
В современном мире технологий искусственные нейронные сети становятся неотъемлемой частью множества инновационных решений, от распознавания речи до автоматического управления транспортными. . .
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
В чем разница между px, in, mm, pt, dip, dp, sp
InfoMaster 20.01.2025
В мире цифрового дизайна и разработки интерфейсов правильный выбор единиц измерения играет ключевую роль в создании качественного пользовательского опыта. История развития систем измерений для. . .
Как изменить адрес удалённого репозитория (origin) в Git
InfoMaster 20.01.2025
В терминологии Git термин origin является стандартным именем для основного удаленного репозитория, с которым взаимодействует локальная копия проекта. Когда разработчик клонирует репозиторий с. . .
Как переместить последние коммиты в новую ветку (branch) в Git
InfoMaster 20.01.2025
При работе над проектом часто возникают ситуации, когда необходимо изолировать определенные изменения от основной линии разработки. Это может быть связано с экспериментальными функциями, исправлением. . .
Как вернуть результат из асинхронной функции в JavaScript
InfoMaster 20.01.2025
Асинхронное программирование представляет собой фундаментальную концепцию в JavaScript, которая позволяет выполнять длительные операции без блокировки основного потока выполнения программы. В. . .
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетов началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые прототипы,. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru