Home arrow Studies arrow Sort Algorithms arrow Heap Sort
Heap Sort PDF Print


Heap sort algorithm is generally used in mass data sorting that doesn't 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..63of 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'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-1div 2]) )/
              ( sqrt( sqr(X[i] - X[(i-1div 2]) + sqr(Y[i] - Y[(i-1div 2])
       tmpY:=( radius*(Y[i]-Y[(i-1div 2]) )/
              ( sqrt( sqr(X[i] - X[(i-1div 2]) + sqr(Y[i] - Y[(i-1div 2])
       X1:= round(X[(i-1div 2] + tmpX);
       Y1:= round(Y[(i-1div 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+1div 2do
  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

 

 
 

Copyright 2003-2007 by Chasan Chouse.

Locations of visitors to this page