Сортировка методом Хоара, исправить ошибку (переполнение стека, бесконечный цикл) - Pascal
Формулировка задачи:
Сортировка методом Хоара.
Нужно первую четверть рассортировать по убыванию, а всё остальное - по возрастанию.
Сделал две процедуры сортировки соответственно потребованному.
Но вот проблема: процедура сортировки по возрастанию(hsv) работает, а процедура сортировки по убыванию(hsu) - не работает.
В Turbo Pascal 7.1 выдаёт ошибку "Stack overflow error"(переполнение стека), а в Free Pascal просто зацикливается на месте. Собственно, я вижу что проблема в процедуре сортировки по убыванию, а вот где именно она и как её решить - не вижу.
Просветите, почему не работает.
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.Решение задачи: «Сортировка методом Хоара, исправить ошибку (переполнение стека, бесконечный цикл)»
textual
Листинг программы
while a[ii]>bb do ii:=ii+1; while a[jj]<bb do jj:=jj-1;