 |
Heap Sort
This
algorithm is generally used in mass data sorting that does not fit in memory.
The Algorithm
Pascal Source Code
{
This program reads the array from text file dizi.dat. Then using Heap Sort method
interactively sorting process is shown in a 640x480x16 VGA graphical mode.
Sample array:
1 3 43 43 54 66 76 73 4 9 44 15 45 34 55 89 32 20 7 4
}
uses crt,graph;
const
radius = 10;
esX = 4;
esY = 2;
FontSize = 3;
X:array[1..63]of integer=(320,160,480,80,240,400,560,40,120,200,280,360,
440,520,600,20,60,100,140,180,220,260,18,300,340,
380,420,460,500,540,580,620,10,30,50,70,90,110,
130,150,170,190,210,230,250,270,290,310,330,350,
370,390,410,430,450,470,490,510,530,550,570,590,
610,630);
Y:array[1..63]of integer=(10,40,40,70,70,70,70,100,100,100,100,100,100,100,
100,130,130,130,130,130,130,130,130,130,130,130,
130,130,130,130,130,160,160,160,160,160,160,160,
160,160,160,160,160,160,160,160,160,160,160,160,
160,160,160,160,160,160,160,160,160,160,160,160,
160);
type
tree = array[1..63] of integer;
var
A:tree; n:byte; ch:char;
MaxX,MaxY : word;
FillInfo: FillSettingsType;
Procedure Read_Array(var A:tree;var n:byte);
var dosya:Text; i, j, k , code:word; strg,strn:string;
Begin
{i-}
assign(dosya,'DIZI.DAT');
reset(dosya);
if ioresult<>0 then
begin
write('couldn't open DIZI.DAT...');
halt(1);
end;
{i+}
i:=0;
while not EOF(dosya) do
begin
strg:='';
strn:='';
j:=0;
while not EOLN(dosya) do
begin
read(dosya,ch);
insert(ch,strn,length(strn)+1);
inc(j);
end;
insert(' ',strn,length(strn)+1);
if j>255 then
begin
writeln;write('Line is bigger than 255 characters...');
halt(1);
end;
for j:=1 to length(strn)+1 do
begin
if (copy(strn,j,1)<>' ') then
begin
insert(copy(strn,j,1),strg,length(strg)+1);
end
else
begin
val(strg,k,code);
if code<>0 then
begin
writeln; write('Couldn't read from file. Don't put spaces in the end of file...');
halt(1);
end;
inc(i);
A[i]:=k;
strg:='';
k:=0;
end;
end;
readln(dosya);
end;
if i>63 then n:=63
else n:=i;
close(dosya);
end;
Procedure Initialize_Graphic_Mode(var MaxX, MaxY : word);
var
Gd, Gm : Integer;
Begin
Gd := detect;
InitGraph(Gd, Gm, '');
if GraphResult <> grOk then
begin
writeln; write('Graphical mode couldn't opened...');
Halt(1);
end;
SetTextStyle(SmallFont, HorizDir, FontSize);
GetFillSettings(FillInfo);
with FillInfo do
SetFillStyle(Pattern, 0);
MaxX := GetmaxX;
MaxY := GetmaxY;
End;
Procedure Write_On_Screen(A : tree; nn : byte; tip : byte);
var
i:byte; S:string;
Begin
SetTextStyle(SmallFont, HorizDir, FontSize+2);
if tip=1 then
outtextxy(1,Y[nn]+30,'original array...')
else
outtextxy(1,Y[nn]+50,'Sorted array...');
if tip=1 then
moveto(1,Y[nn]+40)
else
moveto(1,Y[nn]+60);
for i:=1 to nn do
begin
Str(A[i], S);
outtext(S);outtext(' ');
S:='';
end;
End;
Procedure Draw_Tree(var A : tree; nn:byte);
var
i:integer; s:string[5]; esXX:byte;
tmpX,tmpY:real; X1,X2,Y1,Y2:word;
Begin
setcolor(black);
with FillInfo do
SetFillStyle(Pattern, 0);
rectangle(0,0,MaxX,MaxY);
FillEllipse(X[1],Y[1],radius,radius);
setcolor(white);
circle(X[1], Y[1], radius);
setcolor(Yellow);
if A[1]<10 then esXX:=esX-1
else esXX:=esX+2;
Str(A[1], S);
outtextxy(X[1] - esXX, Y[1] - esY, S);
S:='';
for i:=2 to nn do
begin
if A[i]<10 then esXX:=esX-1
else esXX:=esX+2;
setcolor(black);
FillEllipse(X[i],Y[i],radius,radius);
setcolor(white);
circle(X[i], Y[i], radius);
Str(A[i], S);
setcolor(Yellow);
outtextxy(X[i] - esXX, Y[i] - esY, S);
S:='';
if (i mod 2)=0 then
begin
tmpX:=( radius*(X[i div 2]-X[i]) )/
( sqrt( sqr(X[i div 2] - X[i]) + sqr(Y[i] - Y[i div 2]) ) );
tmpY:=( radius*(Y[i div 2]-Y[i]) )/
( sqrt( sqr(X[i div 2] - X[i]) + sqr(Y[i] - Y[i div 2]) ) );
X1:= round(X[i div 2] - tmpX);
Y1:= round(Y[i div 2] - tmpY);
X2:= round(X[i] + tmpX);
Y2:= round(Y[i] + tmpY);
Line(X1,Y1,X2,Y2);
end
else
begin
tmpX:=( radius*(X[i] - X[(i-1) div 2]) )/
( sqrt( sqr(X[i] - X[(i-1) div 2]) + sqr(Y[i] - Y[(i-1) div 2])
tmpY:=( radius*(Y[i]-Y[(i-1) div 2]) )/
( sqrt( sqr(X[i] - X[(i-1) div 2]) + sqr(Y[i] - Y[(i-1) div 2])
X1:= round(X[(i-1) div 2] + tmpX);
Y1:= round(Y[(i-1) div 2] + tmpY);
X2:= round(X[i] - tmpX);
Y2:= round(Y[i] - tmpY);
Line(X1,Y1,X2,Y2);
end;
end;
End;
Procedure Monitor_Changes(var A:tree; t,k:integer; size:byte; color:byte);
var
S:string; esXX:byte;
Begin
setcolor(white);
with FillInfo do
SetFillStyle(Pattern, 0);
FillEllipse(X[t],Y[t],radius,radius);
FillEllipse(X[k],Y[k],radius,radius);
setcolor(color);
if A[t]<10 then esXX:=esX-1
else esXX:=esX+2;
str(A[t],S);
outtextxy(X[t] - esXX, Y[t] - esY, S);
S:='';
if A[k]<10 then esXX:=esX-1
else esXX:=esX+2;
str(A[k],s);
outtextxy(X[k] - esXX, Y[k] - esY, s);
S:='';
End;
Procedure Heap_Tree(var A:tree; nn:byte);
var
i,i2,i3,j,tmp:integer;
Begin
for i:=1 to ((nn+1) div 2) do
begin
i2:=i+i; i3:=i+i+1;
if (A[i]>A[i2])and((i2)<=nn) then
begin
Monitor_Changes(A,i,i2,FontSize,12);
delay(6000); {<-------------DELAY-------------}
tmp:=A[i];
A[i]:=A[i2];
A[i2]:=tmp;
Monitor_Changes(A,i,i2,FontSize,12);
Draw_Tree(A,nn);
Heap_Tree(A,nn);
end
else if (A[i]>A[i3])and((i3)<=nn) then
begin
Monitor_Changes(A,i,i3,FontSize,12);
delay(6000); {<-------------DELAY-------------}
tmp:=A[i];
A[i]:=A[i3];
A[i3]:=tmp;
Monitor_Changes(A,i,i3,FontSize,12);
Draw_Tree(A,nn);
Heap_Tree(A,nn);
end;
end;
End;
Procedure Heap_Sort(var A:tree;nn:byte);
var
i,j,m:byte; k:integer;
Begin
Write_On_Screen(A,nn,1);
Draw_Tree(A,nn);
Heap_Tree(A,nn);
delay(30000); {<-------------DELAY-------------}
m:=nn;
for i:=1 to nn do
begin
k:=A[1];
for j:=1 to nn-1 do A[j]:=A[j+1];
A[nn]:=k;
m:=m-1;
Draw_Tree(A,nn);
Heap_Tree(A,m);
end;
End;
BEGIN
clrscr;
Read_Array(A,n);
Initialize_Graphic_Mode(MaxX,MaxY);
Heap_Sort(A,n);
Write_On_Screen(A,n,2);
Repeat ch:=readkey until ch=#27;
Closegraph;
END.
Sample Execution

|
 |