Java Algorithms Sort Heap Sort

Description

Java Algorithms Sort Heap Sort


class Node {
   private int iData; // data item (key)

   public Node(int key) {
      iData = key;// w  ww. j a v  a  2s  .  co m
   }

   public int getKey() {
      return iData;
   }
}

class Heap {
   private Node[] heapArray;
   private int maxSize; // size of array
   private int currentSize; // number of items in array

   public Heap(int mx) {
      maxSize = mx;
      currentSize = 0;
      heapArray = new Node[maxSize];
   }

   public Node remove() {
      Node root = heapArray[0];
      heapArray[0] = heapArray[--currentSize];
      trickleDown(0);
      return root;
   }

   public void trickleDown(int index) {
      int largerChild;
      Node top = heapArray[index]; // save root
      while (index < currentSize / 2) // not on bottom row
      {
         int leftChild = 2 * index + 1;
         int rightChild = leftChild + 1;
         // find larger child
         if (rightChild < currentSize && // right ch exists?
               heapArray[leftChild].getKey() < heapArray[rightChild].getKey())
            largerChild = rightChild;
         else
            largerChild = leftChild;
         // top >= largerChild?
         if (top.getKey() >= heapArray[largerChild].getKey())
            break;
         heapArray[index] = heapArray[largerChild];
         index = largerChild;
      }
      heapArray[index] = top;
   }

   public void displayHeap() {
      int nBlanks = 32;
      int itemsPerRow = 1;
      int column = 0;
      int j = 0;
      String dots = "...............................";
      System.out.println(dots + dots);

      while (currentSize > 0) // for each heap item
      {
         if (column == 0) // first item in row?
            for (int k = 0; k < nBlanks; k++) // preceding blanks
               System.out.print(' ');
         // display item
         System.out.print(heapArray[j].getKey());

         if (++j == currentSize)
            break;

         if (++column == itemsPerRow) {
            nBlanks /= 2; // half the blanks
            itemsPerRow *= 2; // twice the items
            column = 0; // start over on
            System.out.println(); // new row
         } else // next item on row
            for (int k = 0; k < nBlanks * 2 - 2; k++)
               System.out.print(' '); // interim blanks
      }
      System.out.println("\n" + dots + dots); // dotted bottom line
   }

   public void displayArray() {
      for (int j = 0; j < maxSize; j++)
         System.out.print(heapArray[j].getKey() + " ");
      System.out.println("");
   }

   public void insertAt(int index, Node newNode) {
      heapArray[index] = newNode;
   }

   public void incrementSize() {
      currentSize++;
   }
}

public class Main {
   public static void main(String[] args) {
      int size = 10, j;

      Heap theHeap = new Heap(size);

      for (j = 0; j < size; j++) // fill array with
      { // random nodes
         int random = (int) (java.lang.Math.random() * 100);
         Node newNode = new Node(random);
         theHeap.insertAt(j, newNode);
         theHeap.incrementSize();
      }

      System.out.print("Random: ");
      theHeap.displayArray(); 

      for (j = size / 2 - 1; j >= 0; j--)
         theHeap.trickleDown(j);

      System.out.print("Heap:   ");
      theHeap.displayArray();
      theHeap.displayHeap(); 

      for (j = size - 1; j >= 0; j--) // remove from heap and
      { 
         Node biggestNode = theHeap.remove();
         theHeap.insertAt(j, biggestNode);
      }
      System.out.print("Sorted: ");
      theHeap.displayArray(); // display sorted array
   }
}



PreviousNext

Related