java算法 堆_JAVA--堆算法实现

/**  *  */ /**  * Date:2013-3-19  *

 * comment: 堆算法实现  *

 *  * @author Liao, Ku-Cheng  */ public class JAVAHeap {     private static int MAX_VALUE = 8;     private Object[] values;     private int size;     private int initCapacity;     public JAVAHeap()     {         this(MAX_VALUE);     }     public JAVAHeap(int initCapacity)     {         this.initCapacity = initCapacity;         if (initCapacity <= 0)         {             initCapacity = MAX_VALUE;         }         values = new Object[initCapacity];     }     /**      * 入堆      *      * @param value      * @return      */     public boolean push(Object value)     {         if (null == value)         {             throw new NullPointerException();         }         if (size == initCapacity)         {             inCreaseCapacity();         }         values[size] = value;         fixAfterInsert();         size++;         return true;     }     /**      * 扩容      */     private void inCreaseCapacity()     {         initCapacity = initCapacity << 1;         Object[] dest = new Object[initCapacity];         System.arraycopy(values, 0, dest, 0, size);         values = dest;     }     /**      * 插入后修复数据      */     private void fixAfterInsert()     {         int index = size;         int pIndex;         while (index > 0)         {             pIndex = (index - 1) / 2;             if (values[pIndex].hashCode() >= values[index].hashCode())             {                 return;             }             else             {                 Object tmp = values[pIndex];                 values[pIndex] = values[index];                 values[index] = tmp;                 index = pIndex;             }         }     }     /**      * 删除数据后修复堆      */     private void fixAfterDelete()     {         int index = 0;         int child;         Object tmp = values[index];         while ((child = getMaxChildIndex(index)) > 0)         {             if (values[index].hashCode() < values[child].hashCode())             {                 values[index] = values[child];                 values[child] = tmp;                 index = child;             }             else             {                 break;             }         }     }     /**      * 获取最大的子节点的下标,如果不存在子节点,返回-1;      *      * @param index      * @return      */     private int getMaxChildIndex(int index)     {         int right = (index + 1) * 2;         int left = index * 2 + 1;         if (right >= size)         {             right = -1;         }         if (left >= size)         {             left = -1;         }         // right == left,此时都为 -1         if (right == left)         {             return -1;         }         // right大于0,因为堆未完全二叉树,这left也大于0         if (right > 0)         {             return values[right].hashCode() > values[left].hashCode() ? right : left;         }         else         {             return left;         }     }     /**      * 获取堆顶数据,同时从堆中移除,如果堆为空,返回null;      *      * @return      */     public Object poll()     {         if (size == 0)         {             return null;         }         Object value = values[0];         size--;         values[0] = values[size];         values[size] = null;         fixAfterDelete();         return value;     }     /**      * 获取堆顶数据;如果堆为空,返回null;      *      * @return      */     public Object get()     {         if (size == 0)         {             return null;         }         return values[0];     }     /**      * 打印数据      */     public void display()     {         for (int i = 0; i < size; i++)         {             System.out.print(values[i] + "  ");         }         System.out.println();     }     public static void main(String[] args)     {         JAVAHeap heap = new JAVAHeap(2);         for (int i = 0; i < 20; i++)         {             heap.push(i);         }         heap.display();         heap.poll();         heap.display();     } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值