Java堆排序算法

前段时间在阅读java中定时器Timer类的时候,其中对于TimerTask的处理是按照Task的时间,通过优先级队列输出最近的执行时间,这个过程中采用了堆排序算法。将相关算法整理了一下。
  1. package heap;
  2. /**
  3.  * Heap sort operation.
  4.  * This programm is based on the source of JDK Timer Class,
  5.  * modified by Mo xuansheng.
  6.  * Author Mo xuansheng
  7.  * Date: 05/11/2008
  8.  */
  9. public class HeapOp {
  10.     private PriorityQueue queue = new PriorityQueue();
  11.     
  12.     public HeapOp() {
  13.         
  14.     }
  15.     public void insert(int a) {
  16.         queue.add(a);
  17.     }
  18.     
  19.     public int retrive() {
  20.         int a =  queue.getMin();
  21.         queue.removeMin();
  22.         return a;
  23.     }
  24.     
  25.     public boolean isQueueEmpty() {
  26.         return queue.isEmpty();
  27.     }
  28.     class PriorityQueue {
  29.         private int[] array = new int[128];
  30.         
  31.         private int size = 0;
  32.         
  33.         public PriorityQueue() {
  34.             
  35.         }
  36.         
  37.          int size() {
  38.             return size;
  39.         }
  40.         
  41.          boolean isEmpty() {
  42.              return size == 0;
  43.          }
  44.                             
  45.          void add(int a) {
  46.              if (++size == array.length) {
  47.                  int[] newarray = new int[2 * array.length];
  48.                  System.arraycopy(array, 0, newarray, 0, size);
  49.                  array = newarray;
  50.              }
  51.              array[size] = a;
  52.              fixUp(size);
  53.          }
  54.          
  55.          int getMin() {
  56.              return array[1];
  57.          }
  58.          
  59.          void removeMin() {
  60.              array[1] = array[size];
  61.              array[size--] = -1;
  62.              fixDown(1);
  63.          }
  64.          
  65.          void clear() {
  66.              for (int i = 1; i < size; i++) 
  67.                  array[i] = -1;
  68.              size = 0;
  69.          }
  70.          
  71.          /**
  72.           * 将新增的数据在数组中进行排序,每增加一个数据Item,
  73.           * 需要和它的父亲节点进行比较,如果数值大于父亲节点,
  74.           * 则,证明改子树维持了堆序列;
  75.           * 如果数值小于父节点,则与父节点交换,此时再次判断
  76.           * 在新位置上的父节点之间的关系
  77.           */
  78.          private  void fixUp(int k) {
  79.              while(k > 1) {
  80.                  int j = k >> 1;
  81.                  if (array[j] <= array[k])
  82.                      break;
  83.                  int tmp = array[j]; array[j] = array[k]; array[k] = tmp;
  84.                  k = j;
  85.              }
  86.          }
  87.          
  88.          /**
  89.           * 当从队列的头部移除最小值以后,将队末的数据Item放置到队首,
  90.           * 然后进行排序。判断它与其子节点之间的大小关系,如果大于子节点,
  91.           * 则与子节点进行交换,以此类推
  92.           */
  93.          private void fixDown(int k) {
  94.              int j;
  95.              while ((j = k <<1) <= size && j > 0) {
  96.                  if (j < size && array[j] > array[j+1])
  97.                      j++; // j indexes the smallest kid
  98.                  if (array[k] <= array[j])
  99.                      break;
  100.                  int tmp = array[j]; array[j] = array[k]; array[k] = tmp;
  101.                  k = j;
  102.              }
  103.          }
  104.          
  105.          void heapify() {
  106.              for (int i = size/2; i >=1; i++)
  107.                  fixDown(i);
  108.          }
  109.     }
  110.     
  111.     public static void main(String args[]) {
  112.         HeapOp heap = new HeapOp();
  113.         //insert the data reversely
  114.         heap.insert(3);
  115.         heap.insert(1);
  116.         heap.insert(5);
  117.         heap.insert(7);
  118.         heap.insert(10);
  119.         heap.insert(8);
  120.         heap.insert(4);
  121.         heap.insert(2);
  122.         heap.insert(6);
  123.         heap.insert(9);
  124. //      for (int i =10 ;i >= 1; i--) {
  125. //          heap.insert(i);
  126. //      }
  127.         
  128.         //output the number orderly
  129.         while(!heap.isQueueEmpty()) {
  130.             System.out.println(heap.retrive());
  131.         }
  132.     }
  133.     
  134. }
关于Timer类的分析,在写。。。

你可能感兴趣的:(java,timer,算法,Date)