http://kamalmeet.com/data-structure/priority-queue/
http://kamalmeet.com/algorithms/heap-data-structure/
package com.kamalmeet.www; /** * This is a sample implementation of Min Priority queue. * This will work for any object type which has a valid comparable interface implemented. * * @Copyright kamalmeet.com * @author kamalmeet * * @param*/ public class MinPriorityQueue { Type minQueue[]=null; int elements=0; /** * Constructor to create a Minimum priority queue of a specific size. * * @param size */ public MinPriorityQueue(int size){ minQueue=(Type[]) new Object[size]; } /** * A new element is always added at the last leaf and then moved up till we find correct position. * * @param t */ public void add(Type t) { if(elements==0) { System.out.println("adding"+t); minQueue[0]=t; System.out.println(minQueue[0]); elements++; } else { System.out.println("adding 2"+t); minQueue[elements]=t; moveUp(elements); elements++; } } /** * Zeroth element is deleted and returned. * Last element would move to root element and queue would be heapified. * * @return */ public Type delete() { Type min=minQueue[0]; minQueue[0]=minQueue[--elements]; moveDown(0); return min; } /** * In Move up or swim method, an element is compared to its parent and moved * up unless correct position is found. * * @param num */ public void moveUp(int num) { System.out.println("move:"+num); while(((Comparable )minQueue[num]).compareTo(minQueue[parent(num)])<0) { swap(num, parent(num)); num=parent(num); } } /** * In move down or sink method, an element is compared to its children and moved * down unless correct position is found. * * @param num */ public void moveDown(int num) { if(leftChild(num)>elements) return; Type leftChild=minQueue[leftChild(num)]; if(rightChild(num)>elements) { if(((Comparable )leftChild).compareTo(minQueue[num])<0) { swap(num, leftChild(num)); return; } } else{ Type rightChild=minQueue[rightChild(num)]; if(((Comparable )leftChild).compareTo(rightChild)<0) { if(((Comparable )leftChild).compareTo(minQueue[num])<0) { swap(num, leftChild(num)); moveDown(leftChild(num)); } } else { if(((Comparable )rightChild).compareTo(minQueue[num])<0) { swap(num, rightChild(num)); moveDown(rightChild(num)); } } } } /** * Method to swap 2 elements. * * @param i * @param j */ public void swap(int i, int j) { Type t=minQueue[i]; minQueue[i]=minQueue[j]; minQueue[j]=t; } /** * Find parent of an element. usually it is element/2 but we need to take * care of the fact that array starts from 0. * * @param i * @return */ public int parent(int i) { if(i==0 || i==1 || i==2) return 0; int p=(i+1)/2; return p-1; } /** * Finds left child for the element. * * @param i * @return */ public int leftChild(int i) { //as array starts from 0, we will need to add 1 initially and subtract 1 finally int c=0; c=(i+1)*2; return c-1; } /** * Find right child for the element. * * @param i * @return */ public int rightChild(int i) { //as array starts from 0, we will need to add 1 initially and subtract 1 finally int c=0; c=((i+1)*2)+1; return c-1; } /** * Method to print the minimum queue (for debug). */ public void print() { for(int i=0;i min= new MinPriorityQueue (10); min.add(11); min.add(88); min.add(99); min.add(43); min.add(2); min.add(36); min.add(222); min.add(123); min.add(7); min.print(); System.out.println("********************"); System.out.println("deleted:"+min.delete()); min.print(); } }