/**
* 二叉堆:使用数组来实现.(数组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;
}
}
堆
最新推荐文章于 2024-05-29 22:37:38 发布