procedure shellsort(first: tlist);
var p,q:tlist; i,h,temp:integer; b:boolean;
begin
clrscr;
h:=0;
p:=first;
while p^.next<>nil do
begin
p:=p^.next;
inc(h)
end;
h:=(h+1) div 2;
while h>1 do
begin
p:=first;
q:=p^.next;
p:=q;
for i:=1 to h-1 do p:=p^.next;
while p<>nil do
begin
if q^.inf>p^.inf
then
begin
temp:=q^.inf;
q^.inf:=p^.inf;
p^.inf:=temp
end;
q:=q^.next;
p:=p^.next
end;
h:=(h+1) div 2;
end;
{ppc}
p:=first;
b:=true;
while (p^.next<>nil) and (b=true) do
begin
p:=p^.next;
if p^.inf>p^.next^.inf then b:=false
end;
while b=false do
begin
if b=false then
begin
p:=first;
q:=p^.next;
p:=q^.next;
while p<>nil do
begin
if q^.inf>p^.inf
then
begin
temp:=q^.inf;
q^.inf:=p^.inf;
p^.inf:=temp
end;
q:=q^.next;
p:=p^.next
end
end;
p:=first;
b:=true;
while (p^.next<>nil) and (b=true) do
begin
p:=p^.next;
if p^.inf>p^.next^.inf then b:=false
end;
end
end;