/**
 * 二叉堆:使用数组来实现.(数组0的位置不存放任何元素,从1开始)
 * 		对于堆中的任意元素X,其父节点的位置为X/2,左子节点位置为2X,右子节点的位置为2X+1;
 * 2016-3-16
 * @author sima
 *
 * @param <T>
 */
public class BinaryHeap<T extends Comparable<? super T>> {
	public BinaryHeap() {
		// TODO Auto-generated constructor stub
	}
	/**
	 * 初始化存放堆得数组的大小
	 * @param capacity
	 */
	public BinaryHeap(int capacity){
		
	}
	public BinaryHeap(T[] items){
		
	}
	public int currentSize; //当前堆中元素数量(不是数组的大小...)
	private T[] array;
	/**
	 * 插入元素:总是在堆得下一个可用位置创建一个空穴,如果X元素插入进去不破坏堆得堆序性质,那么插入成功;
	 * 			否则将该元素的父节点移到该空穴,这样元素就向上移动,直到找到合适的位置为止.
	 * insert
	 */
	public void insert(T ele){
		//表示数组已经满了,需要扩容.
		if(currentSize == array.length - 1)
			;//新的数组的大小为array.length * 2 + 1;
		int hole = ++currentSize;
		for(; hole > 1 && ele.compareTo(array[hole / 2]) < 0; hole = hole >> 2)
			array[hole] = array[ hole >> 1];
		array[ hole ] = ele;
	}
	/**
	 * 删除最小的元素,即根节点元素,此时必须找到最后一个元素需要存放在什么地方.
	 * deleteMin
	 * @return
	 */
	public T deleteMin(){
		// 判断堆是否为空
		
		//找到最小元素:即第一个元素,数组中的第二位位置的元素...
		T minItem = findMin();
		//把最后一个元素暂时存放在位置1中.
		array[1] = array[ currentSize--];
		percolateDown(1); //下虑
		
		return minItem;
	}
	private void percolateDown(int hole) {
		int child;
		//得到最后一个元素.
		T tmp = array[hole];
		for(; hole << 1 <= currentSize; hole = child){
			child = hole << 1;
			if(child != currentSize && array[child + 1].compareTo(array[child]) < 0)
				child++;
			if(array[child].compareTo(tmp) < 0)
				array[hole] = array[child];
			else
				break;
		}
		array[hole] = tmp;
		
	}
	public T findMin() {
		// TODO Auto-generated method stub
		return null;
	}
	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值