uses crt;
const m=5;n=15;
type
plist=^list;
list=record
chislo:integer;
nom_seans:integer;
time_beg:string;
rayd:integer;
mesto:integer;
cena:integer;
next:plist;
end;
stack=record;
t,r:integer;
end;
var
head,q,p,rt,rr,mm:plist;
l,i,j,x:integer;
f,f1,f2:text;
str,str2,red2:string;
a,fil:boolean;
t,r,ww,pp,ll,xx,ln:integer;
s:0..m;
st:array[1..m] of stack;
begin
clrscr;
new(p);
p^.next:=nil;
readln(p^.chislo);
head:=p;
for i:=2 to n do
begin
new(q);
q^.next:=nil;
readln(q^.chislo);
p^.next:=q;
p:=p^.next;
end;
pp:=1;
s:=1; st.t:=1; st.r:=n; l:=1;
repeat
t:=st.t; r:=st.r; s:=s-1;
repeat
i:=t; j:=r; x:=(l+r) div 2;
p:=head;pp:=1;
while (pp<>x) do
begin
p:=p^.next;
pp:=pp+1;
end;
pp:=1;
q:=head;
while (pp<>i) do
begin
q:=q^.next;
pp:=pp+1;
end;
pp:=1; mm:=head;
while (pp<>j) do
begin
mm:=mm^.next;
pp:=pp+1;
end;
repeat
while q^.chislo<p^.chislo do
begin
i:=i+1;
q:=q^.next;
end;
while p^.chislo<mm^.chislo do
begin
j:=j-1;
rr:=head;
while (rr^.next<>mm) do
rr:=rr^.next;
mm:=rr;
end;
if i<=j then
begin
ln:=ln+1;
ww:=q^.chislo;
q^.chislo:=mm^.chislo;
mm^.chislo:=ww;
i:=i+1;
j:=j-1;
end;
pp:=1;
q:=head;
while (pp<>i) do
begin
q:=q^.next;
pp:=pp+1;
end;
pp:=1; mm:=head;
while (pp<j) do
begin
mm:=mm^.next;
pp:=pp+1;
end;
rt:=head;
while (rt<>nil) do
begin
write(rt^.chislo,' ');
rt:=rt^.next;
end;
writeln;
until i>j;
if i<r then
begin
s:=s+1;
st.t:=i;
st.r:=r;
end;
r:=j;
until t>=r;
l:=l+1;
until s=0;
p:=head;
while (p<>nil) do
begin
write(p^.chislo,' ');
p:=p^.next;
end;
end.
Быстрая сортировка
Помогите найти ошибку. Сортировка реализована с помощью указателей. Малое количество элементов сортирует, а большее нет(
а где тут по твоему процедура сортировки?
Код:
pp:=1;
s:=1; st.t:=1; st.r:=n; l:=1;
repeat
t:=st.t; r:=st.r; s:=s-1;
repeat
i:=t; j:=r; x:=(l+r) div 2;
p:=head;pp:=1;
while (pp<>x) do
begin
p:=p^.next;
pp:=pp+1;
end;
pp:=1;
q:=head;
while (pp<>i) do
begin
q:=q^.next;
pp:=pp+1;
end;
pp:=1; mm:=head;
while (pp<>j) do
begin
mm:=mm^.next;
pp:=pp+1;
end;
repeat
while q^.chislo<p^.chislo do
begin
i:=i+1;
q:=q^.next;
end;
while p^.chislo<mm^.chislo do
begin
j:=j-1;
rr:=head;
while (rr^.next<>mm) do
rr:=rr^.next;
mm:=rr;
end;
if i<=j then
begin
ln:=ln+1;
ww:=q^.chislo;
q^.chislo:=mm^.chislo;
mm^.chislo:=ww;
i:=i+1;
j:=j-1;
end;
pp:=1;
q:=head;
while (pp<>i) do
begin
q:=q^.next;
pp:=pp+1;
end;
pp:=1; mm:=head;
while (pp<j) do
begin
mm:=mm^.next;
pp:=pp+1;
end;
rt:=head;
while (rt<>nil) do
begin
write(rt^.chislo,' ');
rt:=rt^.next;
end;
writeln;
until i>j;
if i<r then
begin
s:=s+1;
st.t:=i;
st.r:=r;
end;
r:=j;
until t>=r;
l:=l+1;
until s=0;
s:=1; st.t:=1; st.r:=n; l:=1;
repeat
t:=st.t; r:=st.r; s:=s-1;
repeat
i:=t; j:=r; x:=(l+r) div 2;
p:=head;pp:=1;
while (pp<>x) do
begin
p:=p^.next;
pp:=pp+1;
end;
pp:=1;
q:=head;
while (pp<>i) do
begin
q:=q^.next;
pp:=pp+1;
end;
pp:=1; mm:=head;
while (pp<>j) do
begin
mm:=mm^.next;
pp:=pp+1;
end;
repeat
while q^.chislo<p^.chislo do
begin
i:=i+1;
q:=q^.next;
end;
while p^.chislo<mm^.chislo do
begin
j:=j-1;
rr:=head;
while (rr^.next<>mm) do
rr:=rr^.next;
mm:=rr;
end;
if i<=j then
begin
ln:=ln+1;
ww:=q^.chislo;
q^.chislo:=mm^.chislo;
mm^.chislo:=ww;
i:=i+1;
j:=j-1;
end;
pp:=1;
q:=head;
while (pp<>i) do
begin
q:=q^.next;
pp:=pp+1;
end;
pp:=1; mm:=head;
while (pp<j) do
begin
mm:=mm^.next;
pp:=pp+1;
end;
rt:=head;
while (rt<>nil) do
begin
write(rt^.chislo,' ');
rt:=rt^.next;
end;
writeln;
until i>j;
if i<r then
begin
s:=s+1;
st.t:=i;
st.r:=r;
end;
r:=j;
until t>=r;
l:=l+1;
until s=0;
Я сделала эту сортировку с массивом, всё точно также, и работает... А тут что то сбивается(
осталось лишь найти 10 отличий...
То, код ранее это сама сортировка, а первый код это готовая прога... Она рабочая. Просто я не могу найти ошибку... Я понимаю, что код грамозкий и не хочется с ним возиться, хотя бы просто протестируйте его. Могит с вашим опытом вам с разу будет видна ошибка...
выбросьте эту идею из головы. Копание в таком коде никому не будет полезно. Разбейте прогу на процедуры и тестируйте их по отдельности (желательно автоматически) -- это будет надежнее и быстрее, и может даже получите удовольствие от процесса
Я напоминаю что во первых для выражения благодарности используется репутация (по просьбе мировой закулисы, заместо весов теперь используется шестиконечная звезда :) ). Во вторых - за подобные портянки кода из разряда найди "1000 и одно отличие" я буду выдавать нарушение как за спам.