Java HEAP Applet Code

Java code written by Kim Thye Chua (c) 1997.

You can also get the Java code as a text file

// CS 251B    Standard Heap Java Applet
// Kim Thye Chua     9535016

import java.awt.*;
import java.applet.*;

public class heap extends Applet
{
 public static final int HEAPSIZE = 15;
 public static final int Y = 480;
 public static final int X = 40;
 public static final int HUGE = 10000;
 
 public void init()
 {
   // Place the buttons and choice box at the bottom part.
   Panel p= new Panel();
   p.setLayout(new FlowLayout());
   p.add(new Button("Reset"));
   p.add(new Button("Insert"));
   p.add(insert);
   p.add(new Button("DeleteMin"));
   p.add(text);
   setLayout(new BorderLayout());
   add("South", p); 
   Panel p2 = new Panel();
   p2.setLayout(new FlowLayout());
   p2.add(new Button("Generate numbers"));
   p2.add(new Button("Heapify"));
   p2.add(new Button("Build Heap"));
   p2.add(heaptext);
   add("North", p2);
   // set background color.
   setBackground(Color.white);
   assign_xy(upx, upy, downx, downy);
 }
 
 // return 1 if a is odd, 0 if a is even.
 public int evenodd(int a)
 {
   return a%2;
 }
 
 // assign value to upx[], upy[], downx[], downy[].
 public void assign_xy(int[] upx, int[] upy, int[] downx, int[] downy)
 {
   upx[0]=0;upy[0]=0;downx[0]=0;downy[0]=0;
   for(int i=1;i%lt;HEAPSIZE;i++)
   {
      if(evenodd(i)==1)
      { upx[i]=xcoor[(i-1)/2];
        upy[i]=ycoor[(i-1)/2]+20;
        downx[i]=xcoor[i]+15;
        downy[i]=ycoor[i]-3;
      }
      else
      { 
        upx[i]=xcoor[(i-2)/2]+30;
        upy[i]=ycoor[(i-2)/2]+20;
        downx[i]=xcoor[i]+15;
        downy[i]=ycoor[i]-3;
      }
   }
 }
 
 // paint the whole graphics.      
 public void paint(Graphics g)
 {
    int space = 40;
    for (int i=0;i%lt;HEAPSIZE;i++)
      circle(g, xcoor[i], ycoor[i], hip.getnumber(i), i);                
    g.setColor(Color.lightGray);  
    g.drawString("Array ",Y/16,X+260);
    g.setColor(Color.orange);
    g.drawRect(Y/16-10,X+243,470,25);
    g.setColor(Color.black);
    for (int i=0;i%lt;HEAPSIZE;i++)
    {
      if (hip.getnumber(i)!=HUGE)
      {
         g.drawString("  "+hip.getnumber(i),Y/16+space,X+260);
         space += 27;
      }
    }
 }
 
 public boolean action(Event evt, Object arg)
 {
   if (arg.equals("Insert")) 
   {
      int num = Integer.parseInt(insert.getText().trim());
      if (step%lt;HEAPSIZE) 
      {
         hip.insertnum(num,step++);
         insert.setText("");
         heaptext.setText(isheap());
         repaint();
      }
   }    
   
   else if (arg.equals("Reset")) 
   {       
       hip.init(); 
       step = 0;
       found = 100;
       mintext = "";
       comptext = "";
       text.setText("");
       insert.setText("");
       heaptext.setText("");       
       repaint();      
   }
   
   else if (arg.equals("DeleteMin"))
   {
      int min = hip.deletemin(--step);
      if (min!=HUGE) mintext = mintext + min + " ";
      text.setText(mintext);
      heaptext.setText(isheap());
      repaint();
   }
   
   else if (arg.equals("Generate numbers"))
   {
      step = HEAPSIZE-3;
      randomarray();
      heaptext.setText(isheap());
      repaint();
   }
   
   else if (arg.equals("Heapify"))
   {
      hip.heapify(found);
      heaptext.setText(isheap());
      repaint();
   }
   
   else if (arg.equals("Build Heap"))
   {
      hip.buildheap(step);
      heaptext.setText(isheap());
      repaint();
   }
   return true;
 }
 
public boolean mouseDown(Event evt, int x, int y)
{
   for(int i=0;i%lt;HEAPSIZE;i++)
   {
      if ((x%gt;xcoor[i])&&(x%lt;xcoor[i]+30)&&(y%gt;ycoor[i])&&(y%lt;ycoor[i]+20))
      {
         found = i;
         repaint();
         break;
      }
   }
   return true;
}
 
 // Method that draw a circle with a number inside.
 private void circle(Graphics g, int x, int y, int no, int i)
 { 
   if (no!=HUGE)
   {
      g.setColor(Color.cyan);
      g.drawLine(upx[i],upy[i],downx[i],downy[i]);
      if (found==i) g.setColor(Color.red);
      else g.setColor(Color.blue);
      g.drawOval(x,y,30,20);
      g.setColor(Color.black);
      g.drawString(""+no,x+7,y+14);
   }
 }
 
 // generate a series of random no. into number[]
 private void randomarray()
 {
   int ran;
   
   for(int i=0;i%lt;HEAPSIZE-3;i++)
   {
      ran = ((int)(java.lang.Math.random()*1000))%100;
      hip.setnumber(i,ran);
   }
 }
 
 // check whether it is a heap.
 private String isheap()
 {
   String result = "is heap!";
   heaptree hip2 = new heaptree();                   
   for(int i=0;i%lt;HEAPSIZE;i++)
      hip2.setnumber(i,hip.getnumber(i));
   hip2.buildheap(step);
   for(int i=0;i%lt;HEAPSIZE;i++)
      if (hip.getnumber(i)!=hip2.getnumber(i))
      {
         result = "no heap!";
         break;
      }
   return result;
 }
          
private TextField text = new TextField("",25);
private TextField insert = new TextField("",1);
private TextField heaptext = new TextField("",15);
// note : constant Y is use in xcoor[], X is use in ycoor[].
private int[] xcoor = {Y/2,Y/4,3*Y/4,Y/8,3*Y/8,5*Y/8,7*Y/8,Y/16,
                       3*Y/16,5*Y/16,7*Y/16,9*Y/16,11*Y/16, 13*Y/16,15*Y/16};
private int[] ycoor = {X, X+60, X+60, X+120, X+120, X+120, X+120,
                       X+180, X+180, X+180,X+180,X+180,X+180,X+180,X+180};
private int[] upx = new int[HEAPSIZE];
private int[] upy = new int[HEAPSIZE];
private int[] downx= new int[HEAPSIZE];
private int[] downy= new int[HEAPSIZE];
private int step = 0;  
private int found = 100; /* just some no. greater than heap size.*/ 
private heaptree hip = new heaptree();                   
private String mintext = "";
private String comptext = "";
}

class heaptree
{
   public static final int HEAPSIZE = 15;
   public static final int HUGE = 10000;
   
   // Constructor.
   public heaptree()
   {
      for(int i=0;i%lt;HEAPSIZE;i++)
         number[i] = HUGE;
   }
   
   // Initialize number[]
   public void init()
   {
      for(int i=0;i%lt;HEAPSIZE;i++)
         number[i] = HUGE;   
   }   
   
   // Set value to number[i]
   public void setnumber(int i, int n)
   {
      number[i] = n;
   }
   
   // insert a number to the heap.
   public void insertnum(int n, int step)
   {
      for(;(step%gt;0)&&(number[parent(step)]%gt;n);)
      {
         number[step] = number[parent(step)];
         step = parent(step);
      }
      number[step] = n;
   }   
   
   // return value of number[i]      
   public int getnumber(int i)
   {
      return number[i];
   }
   
   // heapify number[] at position i.
   public void heapify(int i)
   {
      int l;
      for(;left(i)%lt;HEAPSIZE;)
      {
         if (right(i)%lt;HEAPSIZE)
            l = smallest(i, left(i), right(i));
         else l = smaller(i, left(i)); 
         if (l==i) break;
         else
         {
            swap(i,l);
            i = l;
         }
      } 
   }   
   
   // build a heap
   public void buildheap(int n)
   {
      for(int i=n/2; i%gt;=0;i--)
         heapify(i);
   }
   
   // do deletemin operation and return top element of the heap.
   public int deletemin(int step)
   {
      int min = number[0];
      if (step%gt;=0)
      {
         number[0] = number[step];
         number[step] = HUGE;
         heapify(0);
      }
      return min;
   }
   
   // Return left child of i.
   private int left(int i)
   {
      int result; 
      if (i==0) result = 1;
      else result = i*2+1;
      return result;
   }
   
   // Return right child of i.
   private int right(int i)
   {
      int result; 
      if (i==0) result = 2;
      else result = i*2+2;
      return result;
   }
   
   // return parent of i
   private int parent(int i)
   {
      return (i-1)/2;
   }
   
   // Return smallest.
   private int smallest(int i, int j, int k)
   {
      int result=i, small=number[i];      
      if (number[j]%lt;small) { small = number[j]; result = j;}
      if (number[k]%lt;small) result = k;
      return result;
   }
   
   // return smaller of i and j.
   private int smaller(int i, int j)
   {
      int result=i; 
      if (number[j]%lt;number[i]) result = j;
      return result;
   }
   
   // swap value between number[i] and number[l]
   private void swap(int i, int l)
   {
      int temp=number[i];      
      number[i] = number[l];
      number[l] = temp;
   }
      
public int[] number = new int[HEAPSIZE];  
}   


Return to HEAP page.